int i=3;k=(i++)+(++i)+(i++);求k,i的值
int i=3;k=(i++)+(++i)+(i++);执行过后k的值为,i的值为。
i++意思是i先加后面的数再自加。++i是先自加后计算。因为 i=3,所以,从左至右根据优先级,第一个(i++)为(3++)=3,而i=4;到第二个(++i)时,为(++4)=5,而i=5;到第三个(i++)为(5++)=5,而i=6。总的来看k=(i++)+(++i)+(i++)=3+5+5=13。i=6。
扩展资料:
在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性、唯一性。
优先级从上到下依次递减,最上面具有最高的优先级,括号操作符具有最高的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。
k=12,i=6;
系统是这样算的:先令i++与++i同时运算,结果为7, ++i运算后又被前面的i++增1,结果5;所以最后的i++参与运算后自增1为6;
k=7+5=12;
代码如下:
int k, i = 3;
k = (i++) + (++i) + (i++);
cout <<"k="<< k << " " << "i="<<i;
getchar();
return 0;
}运行结果:
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
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
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的值
i都是6,k分别是15,16,9
用VC++6.0出的答案
你们除了考虑优先级外,都不用考虑结合性?比如第一个,(++i)+(++i)+(i++);因为存在两个同级的“+”运算,根据“+”运算符的左结合性,在编译时,其实先处理(++i)+(++i)这部分,然后再将此结果和(i++)相加。