关于自增的问题
#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: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>
所以,这根本就不是知识点,你的纠结和烦恼毫无价值,忘记它吧!
这也提示我们,为了避免出现这样的不确定性,一定要坚决禁止这样写代码! jackz007 发表于 2020-12-15 11:01
不要纠结于这样极端的例子,不同的编译器会得到不同的结果
VC 16.8.2
明白,但是有些考试里就有这种风格的题目,绕的脑袋疼 dysow 发表于 2020-12-15 11:08
明白,但是有些考试里就有这种风格的题目,绕的脑袋疼
这个事实也打脸那些喜欢出这种考题的人,能有标准答案吗? 你所说的 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
风过无痕1989 发表于 2020-12-15 11:52
你所说的 d 等于 22 是错误的!你可以随便找一个编译器进行验证, d = 24
c = (a++) + (a++) + (a++) ...
说话不要那么武断,d = 24 说明你使用 vc 编译器,你再用 gcc 编译试试看。
页:
[1]