如果a的值为5,那么a++ + a的值是多少?

25 浏览
0 Comments

如果a的值为5,那么a++ + a的值是多少?

我是C语言的初学者,我发现很难理解我在下面给出的代码中的后置递增和前置递增。我已经在Turbo C++编译器中编译过它,输出结果是a = 6和b = 10,但由于使用了后置递增运算符,输出应该是a = 6和b = 11,为什么没有发生呢?有人能解释一下吗?

0
0 Comments

在这段代码中,变量a被赋值为5。然后,b被赋值为a,即b的值也为5。接下来,a++的值为5,但是a的值会在任何两个序列点(即最后一个分号和下一个分号之间)之间增加。所以,b被赋值为a++ + a。

然而,问题出现在a++与a的求和操作中。由于a++的副作用是增加a的值,所以在求和时会出现问题。在这种情况下,a的值在求和过程中可能已经增加了,导致求和结果不符合预期。

为了解决这个问题,我们可以使用括号来明确指定求和的顺序,从而避免副作用导致的错误。具体而言,我们可以将代码修改为b = (a++) + a;。这样,首先会计算a++的值,然后再计算a的值,从而得到正确的求和结果。

总结起来,当使用自增运算符时,我们需要注意其副作用可能会导致的错误结果。为了避免这种问题,我们可以使用括号来明确指定运算的顺序。

0
0 Comments

当我们执行b = a++ + a;这行代码时,会出现以下问题:

1) a的值会先被递增,然后将递增前的值与递增后的值相加吗?

2) a的值会先被递增,然后将递增前的值与递增后的值相加吗?

3) 在右边获取a的值,然后将该值与递增后的a的原始值相加吗?

在C语言中,这些方法都是允许的,因为这行代码缺少一个"sequence point",这会定义评估顺序。这种缺乏限制的设计允许编译器生成优化的代码,但同时也带来了问题,因为在不同的访问方式下,这些方法不会生成相同的结果。

因此,这是一个实现定义的行为。为了避免这个问题,我们可以使用以下替代方法:

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

或者

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

0
0 Comments

C语言中的a++ + a;的行为是未定义的。这是因为+不是一个顺序点,你在同一个表达式中尝试增加和读取a

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

为了理解前缀和后缀增量,请使用类似b = a++;b = ++a;的语句。

什么是顺序点?

当我在Ubuntu Linux编译器中运行它时,我得到的输出是a=6和b=11。

你应该谷歌一下,让你的老师也意识到它们;当然要有建设性。

基本上,一个顺序点是一个分号;。你可能还想阅读一下标准的附录C中的更多规则。

0