关于 C 语言中++运算的讨论
姜文周
在C语言教学中讲到例1程序时输出结果分析没有问题。
例1程序
#include "stdio.h"
main()
{ int i=2,l;
k= i ++ + i++ +i++;
printf(" i=%d , k=%d",i,k);
}
输出 i=5 ,k=6
在讲到例 2 时遇到了问题
例 2
#include "stdio.h"
main()
{ int i,l;
i=2;
k= ++i + ( ++i) + (++i);
printf(" i=%d , k=%d",i,k);
}
原讲义中说是
输出 i=5 ,k=15
该讲义以前用过,所以备课时没有仔细分析,授课时学生分析结果应该是 i=5 , k=12,当公布结
果时引起学生的讨论,由于课堂时间有限没有仔细讨论,承诺下次课前专门讨论。
课后将例 2 程序在计算机上行发现了问题。
在 TC 2.0 编译器下运行,输出是:i=5 ,k=15
在 VC 6.0 编译器下运行,输出是:i=5 ,k=13
显然同一个程序在不同的编译器上运行结果不一样,引起兴趣。在百度网上搜索“++i+++i+++i ”
看到了一些讨论的帖子,受到启发,首先看看这些帖子
贴 1
j=(++i)+(++i)+(++i)=(((++i)+(++i))+(++i))
计算机在计算 j=(a+b)+(c+d)+(e+f)先计算(a+b)+(c+d),并把结果存储(例如:存储在 j 中),然后
再计算 j+(e+f)=j;
所以计算机先计算了两个++i(前两项 i 为 3,++i 先于+号);也就是 j=3+3;然后 j=6+(++i)
(最后的 i 为 4),也就是 j=6+4=10。
首先++i=2,再计算第二个++i=3,此时计算机里 i=3,第一个 i 也=3,第二个 i 也=3,因为计算机
里只有一个 i,因此原式=(3+3)+4=10,记住计算机里只有一个 i,算第二个时第一个 i 改变了。
贴 2
j=++i+++i+++i 根据最大可读入原则应该解释成 j=++(i++)+(i++)+i 而++(i++)这个是有
错误 因为 i++只能作为右值,而前增运算符需要左值。
而 j=(++i)+(++i)+(++i)在不同的编译器中结果是不样的比如 tuborC 中为 15 VC 中为 13(象
楼上"鱼鹰"说的) , 这和编译器的结构有关,讨论起来没有多少意义 。
结合帖子的讨论我们再看例 2 的处理过程。
i=2;
k= ++i + ( ++i) + (++i);
我们将这个表达式分为 A、B、C 三个部分,具体如下:
i=2;
k= ++i + ( ++i) + (++i);
A B C
1. 通常的理解
按照 C 语言的算术优先级的定义,这个表达式的计算次序是:
(1) 依据括号的优先级高及同级自左向右的规定,先计算 B: 这时 i 的初值是 2,经过++运算后 i
的值变为 2,B 表达式的值为 3;
(2) 然后计算 C:这时 i 的初值是 3,经过++运算后 i 的值变为 4,C 表达式的值为 4;
(3) 然后计算 A:这时 i 的初值是 4,经过++运算后 i 的值变为 5,C 表达式的值为 5;