友情提示:380元/半年,儿童学编程,就上码丁实验室。
先看一个实例:i = 5;
sum = (++i) + (++i) + (++i) + (++i);
在有的电脑上运行,按照正常的计算逻辑结果应该是30,但结果却是31.为什么会这样呢?
以gcc编译器为例:gcc编译器对表达式求值通常是从左往右依次求各子表达式的值,对于(++i)+(++i)+(++i)+(++i),gcc会把它看做三次加法((a+b)+c)+d,首先求第一次加法两侧操作数a和b的值,对于前缀++,gcc的做法是将变量自增1并返回它的引用(msvc也是),所以(++i)+(++i)的结果是i+i,然后求i的当前值,i自增了2次所以是5+2=7,将7代入i+i得7+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++操作的!