程序输出说明

pro*_*mer 2 c sizeof operator-precedence

谁能解释为什么这个程序打印 4 1 而不是 4 2?

优先级较高的预增量运算符不应该首先执行并打印 4 2 吗?

#include <stdio.h>
int main() {
   int a=1;
   printf ("%ld %d",sizeof(++a),a);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*mit 6

虽然你已经得到了几个答案,我想再提供一个,因为你的问题实际上包含三个不同的误解,我想把它们都说一下。

首先,sizeof是一个特殊的运算符,根据定义,它计算其参数(即,无论它采用的大小是什么子表达式)。所以sizeof(++a)不会增加a。并且sizeof(x = 5)分配5 x。并且sizeof(printf("Hello!"))打印“Hello”。

其次,如果我们去掉sizeof, 简单地写

printf("%d %d", ++a, a);
Run Code Online (Sandbox Code Playgroud)

我们将无法使用优先级来确定行为。优先级是一个重要的概念,但通常它不能帮助您弄清楚涉及++.

最后,也许令人惊讶的答案是,如果你写

printf("%d %d", ++a, a);
Run Code Online (Sandbox Code Playgroud)

这是不可能找出它会在所有的做。它基本上是未定义的。(具体做法是:在任何函数调用喜欢printf("%d %d", x, y)它的不确定,其订购的论点得到评估,所以你不知道是否也x还是y得到第一评价-虽然有订单但后来,当其中一个是,a其中之一是++a,您会遇到a既被修改又使用其值的情况,因此无法知道是使用旧值还是新值,这使得表达式undefined。有关此问题的更多信息,请参阅此问题。)

PS 还有一个我忘了提及的问题,正如来自莫斯科的@Vlad 所指出的:%ld不是打印 的结果的可靠方法sizeof,它是 type 的值size_t%zu如果可以,您应该使用,或者如果不能,则%u在转换后使用(unsigned)