dysow 发表于 2020-12-15 10:47:08

关于自增的问题

#include <stdio.h>

int main()
{
        int a;
        int b;
        int c;
        int d;
       
        a = 5;
        b = 5;
       
        c=(a++)+(a++)+(a++);
        d=(++b)+(++b)+(++b);
       
        printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
}

如上代码,d为啥等于22呢?连续3个++b不应该是6,7,8么,怎么不是21呢?

jackz007 发表于 2020-12-15 11:01:32

本帖最后由 jackz007 于 2020-12-15 11:06 编辑

      不要纠结于这样极端的例子,不同的编译器会得到不同的结果
VC 16.8.2
D:\00.Excise\C>cl x.c
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.28.29334 版
版权所有(C) Microsoft Corporation。保留所有权利。

x.c
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.All rights reserved.

/out:x.exe
x.obj

D:\00.Excise\C>x
a=5,b=5,c=0,d=0
a=8,b=8,c=15,d=24

D:\00.Excise\C>

      gcc 9.2
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
a=5,b=5,c=0,d=0
a=8,b=8,c=18,d=22

D:\00.Excise\C>
      所以,这根本就不是知识点,你的纠结和烦恼毫无价值,忘记它吧!
      这也提示我们,为了避免出现这样的不确定性,一定要坚决禁止这样写代码!

dysow 发表于 2020-12-15 11:08:33

jackz007 发表于 2020-12-15 11:01
不要纠结于这样极端的例子,不同的编译器会得到不同的结果
VC 16.8.2



明白,但是有些考试里就有这种风格的题目,绕的脑袋疼

jackz007 发表于 2020-12-15 11:16:42

dysow 发表于 2020-12-15 11:08
明白,但是有些考试里就有这种风格的题目,绕的脑袋疼

      这个事实也打脸那些喜欢出这种考题的人,能有标准答案吗?

风过无痕1989 发表于 2020-12-15 11:52:06

你所说的 d 等于 22 是错误的!你可以随便找一个编译器进行验证, d = 24
c = (a++) + (a++) + (a++)       // 先运算后自增
= 5 + 5 + 5                           // a = a + 1 + 1 + 1
= 15                                       // a = 8
d = (++b) + (++b) + (++b)       // 先自增后运算
= 8 + 8 + 8                           // b = b + 1 + 1 + 1
= 24                                       // b = 8

jackz007 发表于 2020-12-15 12:48:34

风过无痕1989 发表于 2020-12-15 11:52
你所说的 d 等于 22 是错误的!你可以随便找一个编译器进行验证, d = 24
c = (a++) + (a++) + (a++)      ...

      说话不要那么武断,d = 24 说明你使用 vc 编译器,你再用 gcc 编译试试看。
页: [1]
查看完整版本: 关于自增的问题