谁能解释为什么这个程序打印 4 1 而不是 4 2?
是不是应该先执行优先级高的pre increment运算符打印4 2?
#include <stdio.h>
int main() {
int a=1;
printf ("%ld %d",sizeof(++a),a);
return 0;
}
最佳答案
虽然你已经得到了几个答案,但我想再提供一个,因为你的问题实际上包含三个不同的误解,我想一一触及。
首先,sizeof
是一个特殊的运算符,根据定义,它不 计算它的参数(即,它取大小的任何子表达式)。所以 sizeof(++a)
不会增加 a
。 sizeof(x = 5)
不会将 5 赋值给 x
。而 sizeof(printf("Hello!"))
将不打印“Hello”。
其次,如果我们去掉 sizeof
,只写
printf("%d %d", ++a, a);
我们不能够使用优先级来找出行为。优先级是一个重要的概念,但通常它不会帮助您弄清楚涉及 ++
的混淆操作的行为。
最后,也许令人惊讶的答案是,如果你写
printf("%d %d", ++a, a);
根本不可能弄清楚它会做什么。它基本上是未定义的。 (特别是:在像 printf("%d %d", x, y)
这样的任何函数调用中,未指定参数的计算顺序,所以你不需要知道 x
或 y
是否首先被评估——尽管有一个顺序。但是,当其中一个是 a
并且其中一个是是 ++a
,您会遇到 a
既被修改又被使用的情况,因此无法知道使用的是旧值还是新值,这使得表达式未定义。有关此问题的更多信息,请参阅 this question。)
附言还有一个问题我忘了提,正如来自莫斯科的@Vlad 所指出的:%ld
不是打印 sizeof
结果的可靠方法,它是类型的值大小_t
。如果可以,您应该使用 %zu
,如果不能,则在转换为 (unsigned)
后使用 %u
。
https://stackoverflow.com/questions/66049397/