在两种常用的语言中,最基本的运算符用法不一样,确实很容易混淆。
先看几段小程序运行结果
java中:
public class Test1 {
public static void main(String args[]){
int i=0,k;
k = ++i + ++i + ++i + i++; // 讨论的 表达式
// i=++i + ++i + ++i + i++;
System.out.println("k= "+i);
System.out.println("i= "+i);
}
}
k=9 i=4
C语言中:
#include
void main()
{
int i=0,k=0;
k = ++i + ++i + ++i + i++; //讨论的表达式
// i=++i + ++i + ++i + i++;
printf("k=%d, i=%d\n",k,i);
}
k=10 i=4
同样的表达式,也是最基本的运算符在不同的语言中结果不一致,很郁闷……我们来分析一下
在C语言中 ++i 返回的是应用类型 i++ 返回的是值类型 ,具体点说
k = ++i + ++i + ++i + i++; 相当于计算 k=(++i + ++i) + ++i + i++ 首先计算括弧里面的部分,执行第一个++i 这是i的值是1,到第二个++i 这是i变成了2,
括弧里面的式子是一个整体,前面的i会因为受到后面的影响变成2 所以相当于2+2,这是相当于k=(4+ ++i) + i++;括弧里的i变成3,式子变成k=4+3+i++;
i++先计算i,所以最后k=4+3+3=10 over~
在java中 后面即使是“引用”返回形式他也不会影响到前面,也就是说相当于上面分析过程第一个括弧(++i + ++i) 里面是1+2, 第一个++i 的值不会受到后面的影响,只能前面影响后面 ,相当于k = 1+2+3+3 =9 over~
下面我们再讨论个细节
如果将刚才讨论的表达式改成 i = ++i + ++i + ++i + i++ ; 打印i 的值
在java中 打印的结果还是 9 但是在C语言中结果有原来的10变成了11 ,为什么呢
java中 最后执行的是= ,看下面一段代码就知道我的意思了
k=0;
while(i<10)
{
k=k++;
i++;
}
最后结果k还是0,执行过程是确定使用的k值0,k在自加,然后将之前的0赋给K,所以无论多少次循环值还是不变
在C语言中,= 不是最后执行的,它是先执行完等号,然后在加1,上面的代码第一次循环时 k=0赋给了k,然后k在自加,所以最后k为1,循环十次,k=10
OVER~