C 以下程序在printf中是如何工作的

C 以下程序在printf中是如何工作的,c,C,这是一个程序 #include<stdio.h> int main() { int i=2; printf("I=%d i=%d\n",++i,++i); } 这对我来说有点令人惊讶。 我是怎么工作的?为什么给出的结果是44,而不是34 只需阅读它,它与人们将其标记为重复的线程不同。未定义的行为。您不应该更改变量的值并在同一行中多次读取它。您的程序与下面的程序没有什么不同,因为++i导致i在该行之前递增 #include<stdio.h> int main() {

这是一个程序

#include<stdio.h>
int main()
{
int i=2;
printf("I=%d i=%d\n",++i,++i);
}
这对我来说有点令人惊讶。 我是怎么工作的?为什么给出的结果是
44
,而不是
34


只需阅读它,它与人们将其标记为重复的线程不同。

未定义的行为。您不应该更改变量的值并在同一行中多次读取它。

您的程序与下面的程序没有什么不同,因为++i导致i在该行之前递增

#include<stdio.h>
int main()
{
  int i=2;
  i++, i++;
  printf("I=%d i=%d\n",i,i);
}
#包括
int main()
{
int i=2;
i++,i++;
printf(“I=%d I=%d\n”,I,I);
}

像这样的问题在这个网站上被问了很多。在你提出新问题之前,你应该注意搜索现有的问题。为那些甚至不了解问题是什么就把问题解决掉的人感到羞耻。我没有投票赞成,因为这是值得的。无论如何,问题的关键在于,这个问题的答案与现有问题的答案基本相同:即,在没有插入序列点的情况下读写变量是未定义的行为,编译器可以做任何它想做的事情。问题完全相同,即使程序略有不同。您在同一条指令中修改(并读取)了两次
i
(确切地说,您在没有插入序列点的情况下修改了两次
i
)。另请参见一个类似的示例,其中
i
写了一次,读了两次。@Cem Kalyoncu您能解释一下上面的行为吗?我想知道上面的行为是如何发生的。@Cem-这是不正确的。无法保证这两个增量都会在
printf
之前发生,而且这种行为虽然可能反映了实际发生的情况,但没有定义,也不应该被预期。OP的程序与您答案中的代码不同。@littleadv:我从未见过任何来源说使用++I时有未定义的行为,如果是I++它显然是未定义的。我不知道细节,但这是我读到的。如果您显示一个支持您的声明的引用,我将非常高兴。@Cem-未定义的行为是在没有序列点的情况下多次使用++I。这是根据C++的规范。检查原始问题(这个问题被问到了)以获得更多的细节。
#include<stdio.h>
int main()
{
  int i=2;
  i++, i++;
  printf("I=%d i=%d\n",i,i);
}