"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
而不是转换说明符 %u
。 sizeof x + y
和 sizeof( 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_t
、int
或其他)之间的不匹配 - 如果你正在使用 GCC,你应该将 -Wall -Wextra
添加到你的编译命令中。
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
而不是转换说明符 %u
。 sizeof x + y
和 sizeof( 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_t
、int
或其他)之间的不匹配 - 如果你正在使用 GCC,你应该将 -Wall -Wextra
添加到你的编译命令中。
The result of “sizeof” depends on the location of the brackets. Why?
因为“括号”优先于运算符优先级。