如何解决“sizeof”的结果取决于括号的位置为什么?
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。对于第二个表达式,子表达式 {{1}由于通常的算术转换,} 的类型为 x+y
,所以结果是 4,这就是打印的内容。
这个表达
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 )
。
请注意,在调用 %u
时,您应使用转换说明符 %zu
而不是转换说明符 printf
。 sizeof x + y
和 sizeof( x + y )
这两个表达式的类型都是 size_t
,它是实现定义的类型,通常是类型 unsigned long
的别名。对于类型 size_t
,定义了您将使用的转换说明符 zu
。否则,使用不正确的转换说明符调用 printf
可能会调用未定义的行为。
float
与 sizeof x+y
相同,即 (sizeof x) + y
比 sizeof
具有更高的优先级。
您的编译器应该警告您 +
格式字符串 (printf()
) 和参数(%u
、size_t
或其他)之间的不匹配 - 如果您重新使用 GCC,您应该在编译命令中添加 int
。
“sizeof”的结果取决于括号的位置。为什么?
因为“括号”会覆盖运算符优先级。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。