int i=3;k=(i++)+(++i)+(i++);求k,i的值
int i=3;k=(++i)+(++i)+(++i);求k,i的值
int i=3;k=(i++)+(i++)+(i++);求k,i的值
这几个到底怎么区分啊。。谁那救救我啊。不要去百度copy哈。。知道的高手相助啊。。。在线等 展开
int i=3;k=(++i)+(++i)+(i++);
k=15,i=6;
int i=3;k=(++i)+(++i)+(++i);
k=18,i=6
int i=3;k=(i++)+(i++)+(i++);
k=9,i=6
i=6不管哪种,i都是加了三次,由3到最后的6
主要区别在于i++是先运算,后执行i=i+1
++i是先执行i=i+1,后运算
所以第一个先执行了两次i=i+1后i=5,三个相加后结果是15,然后再加1,i=6
第二个是执行了三次i=i+1后i=6,三个相加后结果是18
第三个是先执行相加,结果为9,后执行三次i=i+1,i=6
扩展资料:
C语言中的 i++ 和 ++i 的区别
i++和++i的区别就是:
i++ :先引用,后增加
++i :先增加,后引用
换句话就是:
i++ : 先在i所在的表达式中使用i的当前值,再让i加1
++i : 先让i加1,再在i所在的表达式中使用i的新值
取决于++和i的相对位置:
++在i前面,i先加1,然后在表达式中用i的值;++在i后面,先在表达式中用i的值,然后i再加1。
例如:
1、i ++:
int i = 0;
while (i < 10) {
i ++;
}
2、++i:
int i = 0;
while (i < 10) {
++ i;
}
1与2,经过运算后,i的值都是10。在while和for循环中的 ++i 和 i++ 是没有区别的。
参考资料来源:INT-百度百科
计算结果为:14,15,12。
首选我们要搞清楚:++ i 是先加后赋值,i ++ 是先赋值后加。++i和i++都是分两步完成的。
比如
a=i++;
先将i的值赋予给a,然后i再进行自增操作,变成i+1。
b=++i;
i先进行自增操作,变成i+1。然后再将这个值传给b。
按照从左到右的计算顺序,下图标出了每个小括号的计算结果,就能得出最后的值:
扩展程序:
i++ 不能作为左值,而++i 可以。
左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。一般来说,左值是可以放到赋值符号左边的变量。
但能否被赋值不是区分左值与右值的依据。比如,C++的const左值是不可赋值的;而作为临时对象的右值可能允许被赋值。左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。
参考资料:自增自减运算符-百度百科
首先,这个结果和编译器对于加法运算的结合方式是有关系的,
这里就分析比较常见的右结合的编译器,也就是对于从右向左进行加法运算的编译器。
如果是左结合编译器,结果就不一样了。
另外还限定一点,i++运算在二元表达式进行完毕后立刻进行++处理,没有其他优化。
现在的编译器太多,规则也不尽相同,差别会比较大的。
两个概念注意实际使用,
1.先不考虑++处理,
b=a1+a2+a3
上面这个语句是先进行加法,最后进行赋值或者++处理,
++处理的优先级比+高,
2.i是一个变量,在声明时,编译器给它分配了存储空间,
所以对于i的任何处理,不论是i++还是++i,也不论处理了几次,都是对于同一块存储空间的处理
下面开始正式的解题:
int i=3;k=(++i)+(++i)+(i++);
i=3,//i的初值为3
k=(++i)+(++i)+(i++);
先从右向左处理:i++加上++i,处理结果再加上++i
i++ //先将i=3代入,由于整个表达式没有处理完毕,先不进行++处理
++i //先进行++处理,i的值为4,再将i代入
所以在执行一次++后,再处理加法,i++加上++i结果为4+4=8
本次加法执行完毕后,i++再处理,i变为5
最左边的++i //先进行++处理,i的值为6,再将i代入
所以表达式运算过程中,i的值变为6,最后进行加法运算:6+8=14
所以加法运算的结果为k的值14,i的值为6
int i=3;k=(++i)+(++i)+(++i);
i=3,//i的初值为3
k=(++i)+(++i)+(++i);
先从右向左处理:++i加上++i,处理结果再加上++i
++i //先进行++处理,i的值为4,再将i代入
++i //先进行++处理,i的值为5,再将i代入
所以在执行两次++后,再处理加法,++i加上++i结果为5+5=10
最左边的++i //先进行++处理,i的值为6,再将i代入
所以表达式运算过程中,i的值变为6,最后进行加法运算:6+10=16
所以加法运算的结果为k的值16,i的值为6
int i=3;k=(i++)+(i++)+(i++);
i=3,//i的初值为3
k=(=(i++)+(i++)+(i++);
先从右向左处理:i++加上i++,处理结果再加上i++
i++ //先将i=3代入,由于整个表达式没有处理完毕,先不进行++处理
i++ //先将i=3代入,由于整个表达式没有处理完毕,先不进行++处理
所以在执行加法时,i++加上i++结果为3+3=6
本次加法执行完毕后,两次i++再处理,i变为5
最左边的i++ //先将i=5代入,由于整个表达式没有处理完毕,先不进行++处理
所以表达式运算过程中,i的值变为5,再进行加法运算:5+6=11
本次加法执行完毕后,i++再处理,i变为6
所以加法运算的结果为k的值11,i的值为6
k=15,i=6;
int i=3;k=(++i)+(++i)+(++i);
k=18,i=6
int i=3;k=(i++)+(i++)+(i++);
k=9,i=6
i=6就不用说了,不管哪种,i都是加了三次,由3到最后的6
主要区别在于i++是先运算,后执行i=i+1
++i是先执行i=i+1,后运算
所以第一个先执行了两次i=i+1后i=5,三个相加后结果是15,然后再加1,i=6
第二个是执行了三次i=i+1后i=6,三个相加后结果是18
第三个是先执行相加,结果为9,后执行三次i=i+1,i=6
int i=3;k=(++i)+(++i)+(++i);求k,i的值
int i=3;k=(i++)+(i++)+(i++);求k,i的值
i都是6,k分别是15,16,9
用VC++6.0出的答案
你们除了考虑优先级外,都不用考虑结合性?比如第一个,(++i)+(++i)+(i++);因为存在两个同级的“+”运算,根据“+”运算符的左结合性,在编译时,其实先处理(++i)+(++i)这部分,然后再将此结果和(i++)相加。