1樓:小夏在深圳
結果為16,說明用的編譯環境是vc++6.0,如用tc環境,則結果為18。
vc環境下,對於前增減運算(++i),自增自減是按從左到右掃描順序,以一個運算子兩邊涉及前自增減的兩個運算物件為單位進行之前增減的;對於後增減運算(i++),是以整個表示式為單位最後統一增減的。
如(i++)+(++i)+(++i)是先對第一個加法運算子兩端的運算物件處理,先自增一次再求解表示式前兩項,然後再對i自增一次再求前一步驟的值與最後一項的和,若初始值i=1,則最終結果2+2+3=7。
(++i)+(++i)+(++i),首先掃描求解前半部分,即(++i)+(++i)的值。先對i進行兩次自增運算,i的值變為5,再計算i+i的值為5+5=10,然後再求解後半部分,即10+(++i)的值,先對變數i自增1次,i的值變為6,再計算10+6=16,所以最終把16賦給變數c。
擴充套件資料
表示式(++i)+(++i)+(++i)結果的源**如下
#include
#include
int main(int argc,char** ar**)
int i=3,j;
j=(i++)+(i++)+(++i);
printf("i = %d, j = %d\n",i,j);
exit(0);
2樓:
答案為18吧?如果是18。我有個解釋是:
有兩點大家一定要弄明白:
一、(++i) 的編譯(計算)過程是,取出變數 i 所代表的記憶體單元裡存的值,把這個值加上 1 ,然後又放回去。具體編譯過程是怎樣的暫時不用管它。
二、k = a + b 的編譯(計算)過程是,取出變數 a 所代表的記憶體單元裡存的值和變數 b 所代表的記憶體單元裡的值,兩個值相加,把結果傳送給 k 【或者是說把結果放到 k 所代表的記憶體單元裡去】
這裡(假設i=3)
編譯器在看到 k = (++i) 時,過程是先把 i 完成自加,此時i的值就是4,【或者說,i 所代表的記憶體單元裡存的值是 4】。
表示式此時雖然變成了 k = (i) 了,但實際上並不是準備要把 4 傳送給 k ,而是 k = (*&i) ;意思是取 i 所代表的記憶體單元的值放到 k 所代表的記憶體單元裡去。
【重點就是在這裡,編譯器只是準備把變數i所代表的記憶體空間裡存的值傳送給表示式左邊而不是傳送 數字4 ,這個涉及到資料存取問題,這裡理解了就好說了】
此時編譯器看到表示式右邊已經沒有繼續計算的步驟了,它就可以完成 k = (*&i) 這一步了。此時 i 所在記憶體單元裡存的值正好是 4 ,所以傳送給 k 的值也就是 4 了。這是最簡單的情況。
下面,換成 k = (++i)+(++i)
編譯器看到 k = (++i)+(++i) 時,第一步:算左邊的 ++i,【i 所代表的記憶體單元裡的值就變成了 4】,然後表示式就成了 k = (i) + (++i) 【實際上是 k = (*&i) + (++i)】;
第二步:編譯器看到後面還有一個加號,它就只好繼續往下走,在看到加號這樣的2目運算子時 ,它就必須馬上找到 加號 另一邊的表示式 並求出其值。此時編譯器在加號右邊又看到了(++i),他就只好再算一次(++i),所以,取出 i 的值是第一步中算完的 i 的值,把這個值加 1 ,結果就是把放回了 i 所代表的記憶體單元裡去了。
【注意, 此時 i 所代表的記憶體單元裡的值就是 5】,此時表示式變成了 k = (i) + (i) 。【實際是 k = (*&i)+(*&i)】
第三步:編譯器看到加號兩邊的表示式都算完了,就可以完成加的操作了,所以開始計算 (i)+(i) 【實際是 (*&i) + (*&i)】,由於 i 的值現在是 5 ,所以就是 5 + 5 ,而不是 4 + 5 。整個結果是 10 。
最後:編譯器看到右邊再沒有需要計算的了,就完成最後的操作: 傳送 (等號)右邊的值 給(等號)左邊。所以最好 k = 10 。 k 的值是
所以分析 k = (++i)+(++i)+(++i) ,最後就是 k = (*&i)+(*&i)+(*&i) ;而大家也知道 最後的 i 值是經過三次自加的結果,這樣一來,k 最後的值就是 k = 6 + 6 + 6 了。結果是 。
這就是我的分析,樓主說結果是 16 .我也就不知道是怎麼回事了。
3樓:
科學解釋是未定義行為(ub)所以在不同的編譯器下會有不同的結果,我們簡化問題改為當i =1時,(++i) + (++i)的值是多少,這時候,編譯器會有幾種不同的操作:
1、(++i) ,i=2;(++i) ,i = 3;i + i = 6
2、a = ++i = 2;b = ++i = 3;結果 = a + b = 5
4樓:
先加再賦值 加法運算是由左向右
++i也就是4 然後賦值給中間的 然後++i也就是5而i在第二輪運算後已經等於5了 然後將i值賦給前後1次運算只能賦值1次 所以中間的i蔣5賦給前後2個後面i++ 最後是5+5+6
5樓:
在vc中,執行順序如下
(++i) ;//(++i) = 4,i=4(++i) ;//(++i) = 5,i=5+ ;i + i = 10,此時加號兩邊都是5(++i) ;//(++i) = 6,i=6+ ;10 + 6 = 16
6樓:匿名使用者
呵呵,有意思.
在vc中應該這樣理解:
做類似(++n)運算是直接在記憶體中完成的,相當於是用匯編裡的自加運算,直接修改記憶體中n的值. 因此,做第一次(++i)後,i=4,做第二個(++i)後,i=5;此時才做第一次括號外的加法,並把結果儲存在臨時變數中temp=10;而此時記憶體中的i已經是5了. 然後在做一次(++i),即i=6;
此時i與臨時變數temp相加,就是最終結果k=16.
不信,你可再加一個(++i),此時,i=7;結果k為23.
所以,這樣完全可以推出它的運算機制.
7樓:面壁的熊貓
c語言裡:
++這個運算子是右結合的運算
你這道題目中++在變數左邊就要先運算++
所以++i是4 之後又有++i所以是5 然後又是++i所以是6最後是k=6+6+6 得到18
但是環境不同就不一樣 在c#中這道題是15 完成表示式的順序不一樣所以這類問題真是...
8樓:財院神仙
int i=3,k;
k = (++i)+(++i)+(++i);
第一個括號裡的值為4(i先自加1後再使用),這裡i的值變為4,第二個括號裡的值則變成5,同理第三個括號裡的值為6,所以最後k的值為4+5+6=15
但是不同的環境結果可能不一樣,這個在我們上課的時候老師也跟我們說過,所以我們在使用的時候就要注意不要使用那些結果不明確的表示式。
9樓:匿名使用者
k=6+6+6=18看不出16來。
10樓:
12吧我覺得
++i就是4,4+4+4=12
11樓:感覺暱稱不重要
k=(++i)+(++i)+(++i)
第一個++i=4,第二個=5;
先算兩個++i的值然後再算第一個「+」,此時i的值為5,所以:5+5=10
第三個++i,由於第二個++i=5,所以i+1=5+1=6.
結果:5+5+6=16
12樓:科力爾
做這種題目真的是沒事找事,給自己找麻煩。這題目根本沒任何意義
13樓:蝶破焰澈
我和上面兩樓的人一樣想法也,可是我執行過了,結果真的是16.奇怪順序相加也不可能會是16呀!奇怪,難道最後k自己加了?
c語言,i=2; j = (++i)+(++i)+(++i) 最後i和j的值是多少,詳細過程
14樓:匿名使用者
j = (++i)+(++i)+(++i)的執行順序是:
1、從左向右數,第一個(++i),執行完畢後,記憶體中i為32、第二個(++i),執行完畢後,記憶體中i為43、第三個(++i),執行完畢後,記憶體中i為54、5+5+5賦給j,記憶體中j為15
所以最後結果i為5,j為15
15樓:驀然回首時
i的初始值是2
j = (++i)+(++i)+(++i);是將(++i)+(++i)+(++i)的結果賦值給j
對於不同的編譯器, (++i)+(++i)+(++i)執行的順序可能不同
但對於本題不影響,我們就按從左往右的順序繼續吧剛編譯了下,發現是這麼算的
第一步計算:(++i)+(++i)
優先括號,i=4, (++i)+(++i) == 4 + 4 == 8
第二步計算:8 + (++i)
j = 8 + 5 = 13
16樓:季子_林
每個編譯器都不一樣的,寫**最好不要這麼寫,很容易出錯。按照自己的邏輯寫就好。
編譯好後,切換到編譯完的彙編,就可以知道他是怎麼運算的了。
把i移到cpu暫存器,inc兩次。就是4,自加1次,就是8,再將i inc一次,就是8+5 =13.
i=5, j=13
17樓:匿名使用者
i=5;j=12;
第一次i++後i=3,第二次i++ 後i=4,第三次i++後i=5,所以j=3+4+5=12
18樓:郝在益
j=12,
i=5,
i依次變為3.4.5
c語言,for迴圈問題for(i=0;i<=1;++i)這樣的迴圈會執行幾次,最後i的值是多少?
19樓:
是那樣理解的,實在不放心,執行驗證就可以了
20樓:匿名使用者
for迴圈的基本語法你應該看過的,再簡單說下
第一個語句是迴圈前執行的操作,一般是用來初始化計數器,這個語句只執行一次
第二個語句是迴圈進行的條件,是一個判斷表示式,如果為真迴圈繼續,否則退出迴圈
第三個語句是每次迴圈執行完畢,判斷是否繼續迴圈之前執行,每迴圈一次執行一次
下面看這個題的分析
i進入迴圈 0 i<=1為真,進入,第一次迴圈
第一次迴圈後 1 i<=1為真,第二次迴圈
第二次迴圈後 2 i<=1為假,退出
所以一共執行2次,i=2
以後可以用迭代法走查,然後有條件的話可以用編譯器除錯。不過最好不要過分依賴編譯器,要有解決問題的能力,這樣會好很多
c語言中語句(i=1,i=10)?i++||++i:++i是什麼意思?結果是多少?
21樓:匿名使用者
||(i=1,i=10)?i++||來++i:++i(i=1,i=10)是真的情況表示式的自值=i++||++i是假的時候=++i
(i=1,i=10)這個是逗號運算子最終i=10,是真所以表示式的值是i++||++i = 10 ||12 = 1
c語言的邏輯表示式
這個必須先弄清楚這三個邏輯運算子的優先順序,這三個中優先順序 最高,其次為 最低。因此對於 a b c 1 先計算 a b 由於 a b,結果為1,1得到0,在計算 c,由於c為非0數值 c語言中,非0數值視為真 所以 c結果為0,由於 優先順序高於 則接下來計算0 0,結果為0.最後計算0 1,則...
c語言中表示式的值怎麼算,C語言中表示式的值怎麼算
墨汁諾 此式即等同於 4!3 2 4 1 5 1代表真,0代表非,則原式即 1 1 0 所以值為0。例如 12 5 2 只為這個是整數運算,結果只取整數部分。62 1 6 7 7 6 1 13 49 623.2 6 7 1 44.8 可以。逗號運算子,從左至右計算,取最後一個表示式的值作為整個語句的...
關於C語言邏輯表示式X ay b II
x a y b ii0 1.include stdio.h include math.h void main 這是一個雙目運算子 判斷到 符號,後面的為0,所以還要再判斷 前面部分。如果後面的為1,則不需要再判斷了。然後首先判斷了x a a賦值給x是否成功,成功為1,然後 x a 即 1為0,0與任...