“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 而不是转换说明符 printfsizeof x + ysizeof( x + y ) 这两个表达式的类型都是 size_t,它是实现定义的类型,通常是类型 unsigned long 的别名。对于类型 size_t,定义了您将使用的转换说明符 zu。否则,使用不正确的转换说明符调用 printf 可能会调用未定义的行为。

,

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

您的编译器应该警告您 + 格式字符串 (printf()) 和参数(%usize_t 或其他)之间的不匹配 - 如果您重新使用 GCC,您应该在编译命令中添加 int

,

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

因为“括号”会覆盖运算符优先级。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...