有一个代码:
float x=-8.92;
int y=5;
printf("%u\n", sizeof x+y);
printf("%u\n", sizeof (x+y));
结论:
9
4
为什么会发生这种情况(结果 9)?毕竟,这些都是简单的一元运算。
有一个代码:
float x=-8.92;
int y=5;
printf("%u\n", sizeof x+y);
printf("%u\n", sizeof (x+y));
结论:
9
4
为什么会发生这种情况(结果 9)?毕竟,这些都是简单的一元运算。
该sizeof运算符的优先级高于二元加法运算符+。所以这:
sizeof x+y
解析为:
(sizeof x)+y
因此,在第一个表达式中,您将获得float系统上 4 的大小并将值 5 添加到该值,得到 9。对于第二个表达式,由于通常的算术转换x+y,子表达式具有类型,所以结果是 4,这是打印的内容。float
这个表达
sizeof x+y
等价于表达式
( sizeof x ) + y
所以 assizeof x 等于sizeof( float )那就是4原始表达式的结果等于9。
该运算符sizeof是一元运算符,其操作数又是一元表达式。也就是说,运算符特别定义为
sizeof unary-expression
x + yx是一个加法表达式,而作为主表达式的变量又是一个一元表达式。因此,运算符应用于变量 x。
另一方面,表达式( x + y )是主表达式,并且由于通常的算术转换具有类型float。所以在这种情况下,当表达式被写成sizeof( x + Y )运算符sizeof再次应用于主(一元)表达式时,就相当于sizeof( float ).
请注意,%u您应该%zu在调用中使用转换说明符而不是转换说明符printf。这两个表达式的类型sizeof x + y和sizeof( x + y )是size_t实现定义的类型,通常是 type 的别名unsigned long。对于类型size_t,定义了zu您将使用的转换说明符。否则,printf使用不正确的转换说明符调用 可能会调用未定义的行为。
sizeof x+y与相同(sizeof x) + y,即优先级高于。sizeof+
您的编译器应该警告您printf()格式字符串 ( %u) 和参数 (size_t或int其他) 之间的不匹配 - 如果您使用的是 GCC,您应该添加-Wall -Wextra到您的编译命令中。
“sizeof”的结果取决于括号的位置。为什么?
因为“括号”覆盖运算符优先级。