为什么++ j不能放在表达式的后面?
而++j则是将j先自增后再参与表达式计算。
如表达式(++j)+j
如开开始j=3,那么先自增1,j=4,并且后面的j也按4算
表达式的值为8
给你看个详细的别人的解释:
1.对++j的处理分两种情况,一种是在表达式进行运算之前就将++j计算,然后再进行表达式运算;第二种是在表达式运算的过程当中进行++j自增并计算表达式的值。
2.两种情况对j++的处理方式一样,都是表达式运算完成后自增,所以j++对表达式的运算无影响。
第一种情况:
就TC来说,他是第一种,先把++j进行自增,然后再进行加法运算,而不管++j出现的顺序,比如:
m+=(j++)+(++j)+(j++);
有一个++j,所以先将j自增一次,假设j = 2,自增一次后为3,最后的运算就是:
m += 3 + 3 + 3;
而不是
m += 2 + 3 + 4, 虽然结果都是m += 9
你试着把他们的顺序换一下:
m+=(j++)+(j++)+(++j);
++j换到了后面,结果仍然是3+3+3,而不是2+2+3,
再如:
m+=(j++)+(++j)+(j++)+(++j);
++j出现了2次,那么先将j自增两次,为4,表达等价于:
m+= 4 + 4 + 4 + 4;
而不是
m+=2+3+2+3;
看下这个表达式的汇编:
1 inc si ;自增j
2 inc si
3 mov ax,si ;加法运算
4 add ax,si
5 add ax,si
6 add ax,si
7 add di,ax
8 inc si ;自增j
9 inc si
第1行和第2行是将++j自增,3到7行是加法运算。8、9行是j++的自增,不参与表达式的运算。
所以使用这种编译方式的编译器,++j的位置对结果无影响。
第二种情况:
VC、dev c,好像gcc也是这种情况,他是在运算过程中对++j进行运算。所以++j的位置对结果有影响。
其中VC的还比较奇特,比如
m=(j++)+(++j)+(++j)+(j++)+(j++);
的汇编:
mov eax, DWORD PTR _j$[ebp]
add eax, 1
mov DWORD PTR _j$[ebp], eax ++j;
mov ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
mov edx, DWORD PTR _j$[ebp]
add edx, 1
mov DWORD PTR _j$[ebp], edx ++j;
add ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
mov DWORD PTR _m$[ebp], ecx
结果是
m = 3 + 3 + 4 + 4 + 4 = 18
但是将其中一个++j调换顺序:
m=(j++)+(++j)+(j++)+(++j)+(j++);
结果是:
m = 3 + 3 + 3 + 4 + 4 = 17
但是
m = (j++)+(j++)+(++j)+(++j)+(j++)+(j++);
结果却是
m = 2 + 2 + 3 + 4 + 4 + 4 = 19
就是说前面两个在第二个++j之前都提前进行了++j,而第三个表达式没有。
总之比较奇特,跟VC编译器代码优化什么的有关系。而且你将VC6的编译改成release,上面第三个表达式的结果就是
m = 4 + 4 + 4 + 4 + 4 + 4 = 24,不是19了!
C语言中++i 和i++有啥区别啊?
++i表示,i自增1后再参与其它运算,而i++ 则是i参与运算后,i的值再自增1。for循环里循环变量增值用i++,而不用++i是因为在循环结构里需要循环变量来结束循环,而使用i++则会导致本来应该继续的循环少执行一次,所以循环结构里通常都是循环变量在一次循环结构执行完成之后再自增。
j++和++j有什么区别
j++是先取j的值,后使j的值加1;++j是先将j的值加1,后取用j的值。如果你认可我的回答,请及时点击【采纳为满意回答】按钮,(或在客户端右上角评价点【满意】)你的采纳,是我前进的动力! 你的采纳也会给你带去财富值的。如有不明白,可以追问,直到完成弄懂此题!
程序设计语言中的++i,j++怎么输才正确?
++在后表示当前使用这个变量的值,使用完后变量的值增加一个,以便下次使用。--操作相同。一般情况下,考试时才会考查学生对++和--位置不同时的结果的分析。在实际使用中,一般都是用在循环变量中,若对循环变量初始化为这一次使用的值,那么就可以把++用在后面,这个也是我们最常用的方法。
j++和++j有什么区别
单独自己一条语句,没有什么区别;如果和别的语句共用计算起来的话,j++会先执行所在语句然后再自增,++j会先自增再执行所在语句
为什么输出i和j的值不一样?
这个跟编译器很有关系,你下面的是分开写的所以一条语句就输出一次,所以变化很清晰。但上面的就有问题了,究竟哪个++、--先发生和后发生都是未知的,不是按照你下面的顺序进行输出,所以就有不同的结果了。这里要牵扯到顺序点和副作用,C\/C++有个规定:在两个顺序点之间,子表达式求值和副作用的...
8、对于语句for(sum=j=0;j<=10;++j)sum+=j;说法不正确的是
答案D 语句执行顺序如下 sum=j=0;-> 判断j<=10(j=0,判断为正确) -> sum+=j(执行循环体); -> ++j;(j加1)-> 判断j<=10(j=1,判断为正确)-> ………-> 判断j<=10(当j=11时,判断为错误) -> 执行完毕 因此根据以上执行顺序,仅有D不正确 ...
“--”运算符表达的是什么意思?
”--“是计算机编程高级语言里的自减运算符。与此相对应的是自增运算符"++"。自减运算只能作用于变量,而不能作用于常量或表达式。
y=++i||++j是什么意思
|| 是或(带短路功能),如果左侧的条件为true,则不计算右侧的条件 比如i = 3 先计算 y=++i ,y=4,true ++i应该没问题吧?整个表达式(y=++i||++j)为真,++j不计算,j数值保持不变
C语言如何计算表达式(x++)+(++x)+(x++)
2.两种情况对j++的处理方式一样,都是表达式运算完成后自增,所以j++对表达式的运算无影响。第一种情况:就TC来说,他是第一种,先把++j进行自增,然后再进行加法运算,而不管++j出现的顺序,比如:m+=(j++)+(++j)+(j++);有一个++j,所以先将j自增一次,假设j = 2,自增一次后为3,...
c++j+是什么意思
在编程语言中,为表达式.。很多编程语言中,在C++中,'j+++'是一种表达式,其中'j++'表示先将j的值增加1,'++'是一个递增运算符。因此,整个表达式的意思是将j的值增加1,再增加一个值(这个值是'++'运算符后面的部分)。