a+的价值是多少++;a的if值为5? 我是C的初学者,我发现很难理解我在下面给出的代码的前和增量,我已经用Turbo C++编译器编译了,我得到了输出。 a=6和b=10但是由于使用了后增量运算符,输出应该是a=6和b=11,为什么没有发生?有人能解释一下吗? #include<stdio.h> int main() { int a=5,b; b = a++ + a; printf("\na = %d and b = %d",a,b); return 0; } #包括 int main() { int a=5,b; b=a+++a; printf(“\na=%d和b=%d”,a,b); 返回0; }

a+的价值是多少++;a的if值为5? 我是C的初学者,我发现很难理解我在下面给出的代码的前和增量,我已经用Turbo C++编译器编译了,我得到了输出。 a=6和b=10但是由于使用了后增量运算符,输出应该是a=6和b=11,为什么没有发生?有人能解释一下吗? #include<stdio.h> int main() { int a=5,b; b = a++ + a; printf("\na = %d and b = %d",a,b); return 0; } #包括 int main() { int a=5,b; b=a+++a; printf(“\na=%d和b=%d”,a,b); 返回0; },c,post-increment,C,Post Increment,a+++a的行为在C中是未定义的。这是因为+不是一个序列点,您实际上是在尝试递增并读取同一表达式中的a 所以你不能保证一个特定的答案 为了理解前缀和后缀的增量,可以使用b=a++和b=++a在inta=5之后a的值是5 b = a; // b is 5; b = a++; // b is 5 int后a=5a++的值为5 b = a; // b is 5; b = a++; // b is 5 但是a++的副作用是增加a的值。这种增加可以在最后一个和下一个序列点(基本上是最后一个和下一个

a+++a的行为在C中是未定义的。这是因为
+
不是一个序列点,您实际上是在尝试递增并读取同一表达式中的
a

所以你不能保证一个特定的答案


为了理解前缀和后缀的增量,可以使用
b=a++
b=++a

inta=5之后a的值是
5

b = a; // b is 5;
b = a++; // b is 5

int后a=5
a++
的值为
5

b = a; // b is 5;
b = a++; // b is 5
但是
a++
的副作用是增加
a
的值。这种增加可以在最后一个和下一个序列点(基本上是最后一个和下一个分号)之间的任何时间发生

所以


接下来会发生什么

b = a++ + a; 
1)
a
是否递增,然后将其原始值添加到
a
的原始值

2)
a
是否递增,然后将其原始值添加到
a
的新值中

3) 右侧的
a
是否先获取,然后添加到递增的
a
的原始值中

C允许这些方法中的任何一种(可能还有其他方法),因为这行代码缺少定义求值顺序的序列点。这种限制的缺失使得编译器常常能够生成优化的代码。这是有代价的,因为当以上述各种方式访问
a
时,这些方法不会产生相同的结果

因此,它是实现定义的行为。相反:

b = a++; 
b = b + a; 


你知道什么是代码块,是吗?使用它们。我投票结束这个问题,因为它是离题的。告诉你的教授/助教不要再发这种垃圾作业。如果这是教授的工作,那么它就和它所涉及的一样令人沮丧。如果你在编译器中提高警告级别,它不会发出关于问题行的诊断吗?我不知道Turbo C++,但是GCC或G++肯定会。什么是排序点?当我在Ubuntu Linux编译器中运行时,我得到的输出是A= 6和B=11@prashanth你应该在谷歌上搜索:让你的老师知道这些;当然是建设性的。@prashanth基本上序列点是分号
。您可能还想在中了解更多有关的一些规则。