自加一运算_C语言i++、++i混合运算老手未必全掌握,看了你就明白了
C語言中的自增自減運算符(i++、i--、++i、--i)對于新手來說,通常感到困惑,說來容易算來難,如果涉及到混合運算,更是無法理解。甚至有些學了幾年的老手,未必全掌握(也許你忽略了這個問題,筆者相信你的能力)。本文以自增運算符為例(自減運算符機理相同),為讀者解惑。一、先談談你可能已經掌握的
1、自增運算符不適用于常量或表達式。如果你試圖寫出諸如2++、(5+6)++、(i+j)++等語句在編譯時均會出現錯誤提示,無法通過編譯。2、自增運算符僅適用于變量,如i++、++i等是沒有問題的。對于其運算機理,相信對于很多老手都很清楚了。對于新手而言,值得一提,它們最終結果均是實現i=i+1這種計算,但計算順序是有不同的。記住一點,i++是先取i的值之后再自加;而++i則是先讓i自加,再取其值。二、再談談你可能困惑的
如果i++、++i參與混合運算,你真的清楚嗎?請看下面的例子,你能回答j、k、l、m、n、t的輸出值是多少嗎?1、例子:
#include <stdio.h>
int main()
{
int i = 3,j=0,k=0,m=0,n=0,t=0,l=0;
j = (i++)+(i++)+(i++);
printf("i=%d,j=%dn",i,j);
i=3;
k = (++i)+(++i)+(++i);
printf("i=%d,k=%dn",i,k);
i=3;
l = (++i)+(++i)+(i++);
printf("i=%d,l=%dn",i,l);
i=3;
m = (i++)+(++i)+(++i);
printf("i=%d,m=%dn",i,m);
i=3;
n=(i++)*(++i)*(++i);
printf("i=%d,n=%dn",i,n);
i=3;
t=(++i)*(++i)*(i++);
printf("i=%d,t=%dn",i,t);
return 0;
}
有些讀者可能會說,這還不簡單,那就按照上面你講的i++是先取i的值之后再自加;而++i則是先讓i自加,再取其值,這樣按照優先級逐步計算就是了,于是就得出以下答案:j=12,k=15,l=14,m=12,n=60,t=100。如果你這樣想又錯了。以VC++6.0開發環境為例(不同開發環境由于編譯原理不同可能會有差異,讀者一定要注意),其運行結果為j=9,k=16,l=15,m=13,n=80,t=125,如下圖所示。
程序運行結果2、例程分析
有些讀者可能對此結果非常不解,尤其是l和m的操作數只是順序不同,值為何不一樣了。下面我們來分析一下運算機理。在VC++6.0中,表達式按優先級運算前對操作數++i先自增1,而且長表達式是分步計算的,對表達式中還未參與運算的所有操作數i均有影響(已經計算的i不受影響),一邊計算一遍確定操作數i的值,整個表達式計算完成后再對i++實現自增。如l的計算,先計算前兩項使得兩個++i總共自增了兩次即i=5,該步計算相當于5+5=10;第二步計算10+(i++),這時取i的值為5參與運算得結果15,最后i++項自增1,使i變為6,完成計算。再比如m的計算,先計算前兩項,僅有一個++i,自增1得i=4,即實現4+4=8;第二步計算8+(++i),i自增1得i=5,于是得到結果m=8+5=13,最后i++項自增1,使i變為6,完成計算。其它表達式計算機理相同,請讀者驗證。三、總結
學編程語言要細心,多編程,多看例程,會逐步提高。
我是“Coc編程”如果你覺得本文有幫助,請關注我,并點贊。有疑問或其它要探討的問題,請留言,感謝!
總結
以上是生活随笔為你收集整理的自加一运算_C语言i++、++i混合运算老手未必全掌握,看了你就明白了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dw新建php文件自动生成html,dw
- 下一篇: c语言中的运算符按位或,|按位或运算符