AFAIK sizeof不会将其操作数评估为C ++。
E.g。
int x = 0;
sizeof(x += 1); // value of x is not changed
但这是什么意思?
int arr[5];
sizeof(arr+0); // here array is converted to pointer
为什么在这里应用数组算术?
(§5.3.3/ 4)左值到右值(4.1),数组到指针(4.2),以及 函数到指针(4.3)标准转换不适用于 sizeof的操作数。
答案 0 :(得分:17)
sizeof()运算符在编译时计算。表达式 NOT 已评估。它是(在编译时)计算的表达式的类型,然后由sizeof()使用。
所以在你的第一个:
sizeof( x += 1);
x的类型是int。 + =运算符的结果仍然是int。所以sizeof()仍然是int的大小。
在此:
sizeof(arr+0);
这里arr是一个数组,并且会返回数组的大小(如果它本身使用的话)。但是运算符+使数组衰减成指针。数组上的+运算符和整数的结果是指针。所以这里sizeof()运算符将返回指针的大小。
(第5.3.3 / 4节)左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)标准转换不应用于sizeof的操作数。
这意味着:
std::cout << sizeof(arr);
// would print sizeof(int)* 5 (because there is no conversion)
// if sizeof() had behaved like a normal function there
// would have been a conversion but as you pointed out that
// does not apply.
但是在这里:
std::cout << sizeof(arr + 5);
// prints the sizeof(int*) because the result of the expression
// is a pointer type (int*)
这就是为什么
int x[0];
int const xSize = sizeof(x)/sizeof(x[0]);
// This works correctly even though x[0] is technically
// not valid if used in a real expression (but is valid here).
答案 1 :(得分:6)
不是。在算术表达式中,数组名称会衰减为指针。这对于执行计算本身没有任何意义。 +
的类型可以从其操作数的类型中推导出来,在本例中为指针和整数,产生与sizeof(int*)
相同的结果。
答案 2 :(得分:4)
我对此并不了解,但如果如你所说,sizeof不评估其操作数,那么它必须依赖于它所使用的表达式的类型。所以我猜我自己arr
的类型与arr+0
不同,这就是它被使用的原因。