una - que significa i++ en c++
El operador de incremento no se invoca a la expresión sizeof(++ n) (4)
En C ++ sizeof
no evalúa su operando.
Cita del estándar C ++, parte [expr] 5/7
en C ++ 11 o [expr] 5/8
en C ++ 14:
En algunos contextos, aparecen operandos no evaluados (
5.2.8
,5.3.3
,5.3.7
,7.1.6.2
). Un operando no evaluado no se evalúa.
Aquí 5.3.3
refiere a sizeof
(y otros son typeid
, noexcept
y decltype
).
C ++ 98 estándar no tiene este párrafo, pero de todos modos en su parte 5.3.3 Sizeof
dice esencialmente lo mismo que los estándares más nuevos:
El operador
sizeof
produce el número de bytes en la representación del objeto de su operando. El operando es una expresión que no se evalúa o un ID de tipo entre paréntesis.
En C o C ++, el operador de incremento y decremento ( ++n
, - ++n
) no se realiza cuando está en un operador sizeof()
.
int n = 100;
int size_int = sizeof(++n);
std::cout<<n;
He escrito este código y ejecuto el programa. Por supuesto, creo que 101 se mostrará para mí. Pero, n
no era 101, era 100.
¿Porqué es eso?
En C ++, las expresiones dentro de sizeof
no se evalúan, a excepción del VLA de C99 como se menciona en los comentarios, ya que también se etiquetó anteriormente para C
El operador sizeof
se calcula en tiempo de compilación.
Solo el tipo de la expresión (que se calcula en tiempo de compilación) es luego utilizado por sizeof
.
De C ++ Estándar § 5.3.3 Sizeof
El operador sizeof produce el número de bytes en la representación del objeto de su operando. El operando es una expresión, que es un operando no evaluado (Cláusula 5), o un ID de tipo entre paréntesis.
Algunos compiladores de C ++ proporcionan VLA como una extensión como se comenta a continuación .
En C, el operando de sizeof
no se evalúa a excepción de las matrices de longitud variable:
6.5.3.4. p2:
El operador sizeof produce el tamaño (en bytes) de su operando, que puede ser una expresión o el nombre entre paréntesis de un tipo. El tamaño se determina a partir del tipo de operando. El resultado es un entero. Si el tipo del operando es un tipo de matriz de longitud variable, se evalúa el operando; de lo contrario, el operando no se evalúa y el resultado es una constante entera
Si pones n++
en una matriz de longitud variable, por ejemplo:
int n = 1 ;
sizeof( int(*)[n++] ) ;
entonces no se especifica si el operando es evaluado.
6.7.6.2. p5
Si el tamaño es una expresión que no es una expresión constante entera: si ocurre en una declaración en el alcance del prototipo de la función, se trata como si fuera reemplazado por *; de lo contrario, cada vez que se evalúe tendrá un valor mayor que cero. El tamaño de cada instancia de un tipo de matriz de longitud variable no cambia durante su vida útil. Donde una expresión de tamaño es parte del operando de un operador sizeof y cambiar el valor de la expresión de tamaño no afectaría el resultado del operador, no se especifica si se evalúa o no la expresión de tamaño .
Si mira el desarmado de:
int size_int = sizeof(++n);
Entonces verá algo así como (dependiendo de su compilador):
mov dword ptr [size_int],4
La expresión sizeof(...)
se evalúa durante el tiempo de compilación y se reemplaza con un valor constante.
En el ejemplo anterior, el valor constante con el que se reemplaza la expresión sizeof(...)
es 4.