Подтвердить что ты не робот

Оператор приращения не вызывается при выражении sizeof (++ n)

В C или С++ оператор приращения и уменьшения (++n, --n) не выполняется, когда он находится в операторе sizeof().

int n = 100;
int size_int = sizeof(++n);
std::cout<<n;

Я написал этот код и запустил программу. Конечно, я думаю, что 101 будет показан для меня. Но n не было 101, это было 100.

Почему это?

4b9b3361

Ответ 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.