"sizeof" 的结果取决于方括号的位置。为什么?

The result of "sizeof" depends on the location of the brackets. Why?

有一个密码:

 float x=-8.92;
 int y=5;
 printf("%u\n", sizeof x+y);
 printf("%u\n", sizeof (x+y));

结论:

9
4

为什么会这样(结果 9)?毕竟,这些都是简单的一元运算。

这个表达式

sizeof x+y

等同于表达式

( sizeof x ) + y

因此 sizeof x 等于 sizeof( float )4 那么原始表达式的结果等于 9.

运算符sizeof是一元运算符,其操作数又是一元表达式。那就是运算符特别定义为

sizeof unary-expression

x + y 是加法表达式,而作为主表达式的变量 x 又是一元表达式。因此运算符应用于变量 x.

另一方面,表达式 ( x + y ) 是一个基本表达式,并且由于通常的算术转换具有类型 float。所以在这种情况下,当表达式写成 sizeof( x + Y ) 时,运算符 sizeof 再次应用于主要(一元)表达式并且等效于 sizeof( float ).

请注意,在 printf 的调用中,您应该使用转换说明符 %zu 而不是转换说明符 %usizeof x + ysizeof( x + y ) 这两个表达式的类型都是 size_t,这是一个实现定义的类型,通常是类型 unsigned long 的别名。对于类型 size_t,定义了您将使用的转换说明符 zu。否则,使用不正确的转换说明符调用 printf 会引发未定义的行为。

sizeof 运算符的优先级高于二元加法运算符 +。所以这个:

sizeof x+y

解析为:

(sizeof x)+y

因此,在第一个表达式中,您将获得 float 的大小,在您的系统中为 4,并将值 5 添加到该值,结果为 9。对于第二个表达式,子表达式 x+y 具有类型 float 因为 通常的算术转换 ,所以结果是 4,这是打印出来的。

sizeof x+y(sizeof x) + y 相同,即 sizeof+ 具有 更高的优先级

您的编译器应该警告您 printf() 格式字符串 (%u) 和参数(size_tint 或其他)之间的不匹配 - 如果你正在使用 GCC,你应该将 -Wall -Wextra 添加到你的编译命令中。

The result of “sizeof” depends on the location of the brackets. Why?

因为“括号”优先于运算符优先级。