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++意思是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++)相加。