Оператор приращения не вызывается при выражении sizeof (++ n)
В C или С++ оператор приращения и уменьшения (++n
, --n
) не выполняется, когда он находится в операторе sizeof()
.
int n = 100;
int size_int = sizeof(++n);
std::cout<<n;
Я написал этот код и запустил программу. Конечно, я думаю, что 101 будет показан для меня.
Но n
не было 101, это было 100.
Почему это?
Ответы
Ответ 1
В С++ выражения внутри sizeof
не оцениваются, , за исключением C99 VLA как указано в комментариях, так как это было ранее отмечено для C тоже
Оператор sizeof
вычисляется во время компиляции.
Только тип выражения (который вычисляется во время компиляции) затем используется sizeof
.
От Стандарт С++ § 5.3.3 Размер
Оператор sizeof дает количество байтов в объекте представление его операнда. Операнд является либо выражением, который является неоцененным операндом (п. 5) или скобкой тип-идентификатор.
Некоторые компиляторы С++ предоставляют VLA как расширение как описано ниже.
Ответ 2
В C операнд sizeof
не оценивается за исключением массивов переменной длины:
6.5.3.4. p2:
Оператор sizeof дает размер (в байтах) своего операнда, который может быть выражение или имя в скобках типа. Размер определяется по типу операнд. Результат - целое число. Если тип операнда представляет собой массив переменной длины тип, операнд оценивается; в противном случае операнд не оценивается, и результат целочисленная константа
Если вы поместите n++
в массив переменной длины, например:
int n = 1 ;
sizeof( int(*)[n++] ) ;
то он не определен, если операнд оценивается.
6.7.6.2. р5
Если размер является выражением, которое не является целочисленным постоянным выражением: если оно встречается в декларация в области прототипа функции, она обрабатывается так, как если бы она была заменена на *; в противном случае, каждый раз, когда он оценивается, он должен иметь значение больше нуля. Размер каждого экземпляра типа массива переменной длины не изменяется в течение его срока службы. Где размер выражение является частью операнда оператора sizeof и изменяет значение выражение размера не повлияет на результат оператора, не определено, независимо от того, выражение размера оценивается.
Ответ 3
В С++ sizeof
не оценивается его операнд.
Цитата из стандарта С++, часть [expr] 5/7
в С++ 11 или [expr] 5/8
в С++ 14:
В некоторых контекстах отображаются неоцененные операнды (5.2.8
, 5.3.3
, 5.3.7
, 7.1.6.2
). Неопределенный операнд не оценивается.
Здесь 5.3.3
относится к sizeof
(а другие typeid
, noexcept
и decltype
).
Стандарт С++ 98 не имеет этого абзаца, но в любом случае в его части 5.3.3 Sizeof
он, по сути, соответствует новым стандартам:
Оператор sizeof
дает количество байтов в представлении объекта своего операнда. Операндом является либо выражение, которое не оценивается, либо идентификатор типа в скобках.
Ответ 4
Если вы проверите сборку:
int size_int = sizeof(++n);
Затем вы увидите что-то вроде (в зависимости от вашего компилятора):
mov dword ptr [size_int],4
Выражение sizeof(...)
оценивается во время компиляции и заменяется на постоянное значение.
В приведенном выше примере константное значение, которое заменяется выражением sizeof(...)
, равно 4.