最新消息:

C++:自增自减运算符的陷阱

C++ 少儿编程 1425浏览 0评论
先看一个实例:i = 5;

sum = (++i) + (++i) + (++i) + (++i);

在有的电脑上运行,按照正常的计算逻辑结果应该是30,但结果却是31.为什么会这样呢?

gcc编译器为例:gcc编译器对表达式求值通常是从左往右依次求各子表达式的值,对于(++i)+(++i)+(++i)+(++i)gcc会把它看做三次加法((a+b)+c)+d,首先求第一次加法两侧操作数ab的值,对于前缀++gcc的做法是将变量自增1并返回它的引用(msvc也是),所以(++i)+(++i)的结果是i+i,然后求i的当前值,i自增了2次所以是5+2=7,将7代入i+i7+7=14;接下来求(14+c)+d中第二次加法右侧操作数c的值,同样,将i自增1并返回引用,得8,执行加法14+8=22;最后求第三次加法22+d中右侧操作数d的值,得9,执行加法,得22+9=31

因此我们平时在写代码时,尽量不要写出这样风格不好的代码,因为它不仅会给程序带来不确定性,可能会引起任何后果(比如程序崩溃),而且对于代码的移植性来说是致命的打击。

自增、自减语句最好作为一个单独使用行。

再看一个事例:

x = 5;

cout << sizeof(x++) << endl;

执行之后,变量x的值应该是多少呢?结果还是5!没想到吧?这是因为求字节运算sizeof用于计算数据类型所占的字节数,它是不会去执行x++操作的!

您必须 登录 才能发表评论!