【问题标题】:what is the value of a++ + a if value of a is 5? [duplicate]如果 a 的值为 5,a++ + a 的值是多少? [复制]
【发布时间】:2016-03-17 14:10:32
【问题描述】:

我是 c 的初学者,我发现很难理解我在下面给出我的代码的 post 和 pre increment,我已经在 turbo c++ 编译器中编译了它,我得到的输出为 a = 6 and 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;    
}

【问题讨论】:

  • 你知道什么是代码块,是吗?使用它们。
  • 我投票结束这个问题,因为它离题了。
  • 告诉你的教授/助教停止分发这些垃圾作业。
  • 如果这是一位教授的作品,那它既令人沮丧又令人担忧。
  • 如果您在编译器中调高警告级别,它不会发出有关该行的诊断信息吗?我不知道 Turbo C++,但 gcc 或 g++ 肯定会。

标签: c post-increment


【解决方案1】:

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

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

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

【讨论】:

  • 什么是排序点?
  • 当我在 ubuntu linux 编译器中运行它时,我得到的输出为 a=6 和 b=11
  • @prashanth 你应该谷歌一下:让你的老师知道他们;当然是建设性的。
  • @prashanth 基本上是一个 sequence point 是一个分号 ;。您可能还想在Annex C of the Standard 中了解更多规则。
【解决方案2】:

接下来会发生什么?

b = a++ + a; 

1) a 是否递增,然后将其原始值与a 的原始值相加?

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

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

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

因此它是实现定义的行为。而是:

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

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

【讨论】:

    【解决方案3】:

    int a = 5;之后a的值为5

    b = a; // b is 5;
    

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

    b = a++; // b is 5
    

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

    所以

    /* ... */;
    b = a++ + a;
    #if 0
        /* side-effect */ 5 + 6
        5 /* side-effect */ + 6
        5 + /* side effect mixed with reading the value originating a strange value */ BOOM
        5 + 5 /* side effect */
    #endif
    

    【讨论】:

      猜你喜欢
      • 2015-06-04
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      相关资源
      最近更新 更多