sizeof操作数得到评估?

时间:2011-10-17 01:06:59

标签: c++

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的操作数。

3 个答案:

答案 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不同,这就是它被使用的原因。