C語言 如果i 3,則kiii 執行過後k的值為?好評立刻

時間 2022-03-08 17:25:15

1樓:

結果應該是18.

編譯程式是這樣處理的,對有含有++i的表示式,先進行i的自增運算,然後再計算其所在的表示式。

對於k=(++i)+(++i)+(++i)這個表示式,先計算其中的++運算,即連續進行三次的自增1,即i=6,然後再計算這個表示式,即6+6+6=18

2樓:井丁辰玉洛

k=(++i)+(++i)+(++i)

++在變數前時優先順序最高,因此優先於其他基本運算子執行,整個式子按從左到右依次解釋執行

+是一個二元運算子,執行(++i)+(++i)時,由於括號優先順序高於一切,式子從左到右計算,因此先計算第一個++i,此時i=4;再計算第二個++i,此時i=5;再計算+號,得5+5=10;下一步,計算10+(++i),先計算++i得6,再計算10+6=16,最後結果為16。

得出這個結果需要注意兩點,第一個是++i和i=i+1的區別,++i在彙編中是inc指令自加,而i=i+1是add

i,1操作,inc優先順序高於add,因此執行順序是先++再+號。第二個是c語言中運算式執行順序是從左到右依次解釋執行的

求助一個c語言的問題 int i=3; 則k=(i++)+(i++)+(i++);執行過後k的

3樓:匿名使用者

這個問題給你說了答案,以後你還會遇到很多次這樣的問題。

不如直接告訴你原理來得實在。

關於++i,i++的問題看下面看完你再不會,打死我吧!),請認真讀完。然後再回來看你這道題。完全就是小兒科。

++是c++的自增運算子,作用是使變數自加1;——是自減運算子,作用是使變數自減1.++和——有兩種用法,一種是字首用法,一種是字尾用法。字首用法如:

++i、——i ,字尾用法如i++、i——,字首用法跟字尾用法的差別在於字首時++i的值為完成i加1後的值,——i為完成i減1後的值。例如:假設i的初值為3,執行cout<<++i<

#include

using namespace std;

int main()

int i=3;

cout<<(i++)+(i++)+(i++)

問,第一次和第二次輸出的結果分別是多少?

有人說,是12和6.理由是,表示式從左至右開始計算,因為第一個括號內++運算子是字尾用法,i的初值為3,所以,第一個括號的值是3,計算完第一個括號之後,i自加1,變成4,然後計算第二個括號,第二個括號裡的++也是字尾用法,所以,值為4,執行完第二個括號後,i再加1,變成5,接下計算第三個括號,第三個括號裡的++也是字尾用法,所以,第三個括號的值為5,然後計算第三個括號相加的和,即3+4+5=12.這個理由看起來不錯,似乎應當是這樣。

然而,執行結果卻讓人大跌眼鏡,竟然是9和6.這是怎麼回事呢?說起來也很簡單,這是因為很多編譯系統規定,在遇到一條計算表示式中同時出現若干i++、i——的情況時,在當前語句中並不執行i的自增和自減,i的初值是多少,i++和i——的值就是多少,當這條表示式執行完成之後,再將i連續自加或自減若干次。

再看如下**:

#include

using namespace std;

int main()

int i=3;

cout<<(++i)+(++i)+(++i)

問,第一次和第二次輸出的結果分別是多少?

有人說,結果應該是4+5+6=15和6.理由我想大家都想明白,我就不多說了。還有人總結了上例的經驗,認為,輸出結果應該是9和6.我們來執行一下這個程式,看看誰說得對……

好了,執行結果出來了,不過這不是什麼好結果,可能很多人看完會抓狂,結果盡然是神鬼莫測的18和6.為什麼呢?道理跟上例差不多,那就是很編譯系統規定,連續多個字首式++和——運算子出現在同一個運算表示式中時,先將變數連續自加或自減n次,然後判定++i的值為i+n.

為了驗證上面的說法,請看下面的**:

#include

using namespace std;

int main()

int i=3;

cout<<(++i)+(i++)+(++i)

按照我們上面的推測,第一個輸出語句應當是這樣執行的:首先,掃描整條運算表示式(++i)+(i++)+(++i),發現有兩處++的字首式用法,於是,將i連續自加兩次,然後開始計算表示式,第一個括號是++i,判定為5,第二個括號是i++,判定值為5,第三個括號是++i判定值為5,最後,計算結果5+5+5=15.因為表示式中有一個i++,所以執行計算完之後將i的值再自加1,變為6.

執行程式,驗證一下,果然,結果就是15和6.

下面在來討論一下網上很多c++論壇裡討論得很多的int i=3;問++i+++i+i++的值是多少的問題。

我看到csdn裡也有人在討論這個問題,很多人在回帖,答案似乎多種多樣,有說是12的,有說是18的,更有說是9的,更有一條回帖十分搞笑——「答案是×××,這是很早以前我的一個很牛×的老師教我的解法得出的結果」。我很無語。學過編譯原理的人都知道,「++i+++i」這一段根本就無法解析,編譯系統從左至右掃描整條語句,先遇到++i,判斷出來是一個i的字首自加運算,然後接著掃描,遇到一個+,+是一個二目運算子,它的左邊已經有一個運算數++i了,系統就向右搜尋第二個運算數,又遇到一個+,++比+的運算級別要高,這時,編譯系統就將兩個+看成一個整體來處理,既然是++,編譯系統就認定,肯定它的左邊或右邊有一個變數,編譯系統先搜尋左邊,發現有一個 i,是個變數,於是它就將i和其後的++組合起來,這時問題就發生了,也就是說第一個i被編譯系統綁架到它後面的++那裡去了,那麼i前面的++是個什麼東西呢?

編譯系統是無法搞明白的,它會倒回去重新搜尋++前面是否有左值,發現沒有,因此它就認為++是一個缺少左值的自增運算子,於是提示提示使用者:'++' needs l-value

我們寫個程式驗證一下上面的推測:

#include

using namespace std;

int main()

int i=3;

cout<<++i+++i+i++

果然,編譯時有一個錯誤,提示error c2105: '++' needs l-value ,證實了我們的推測。這個問題的討論使我們得出一個結論:

如果一個變數ni的兩側都有++或——運算子並且ni左邊的表示式不能分解成x+或x-的形式,那麼編譯就會出錯,x是有值變數。結論有點繞口,舉例說明吧:

程式1#include

using namespace std;

int main()

int i=3;

cout

程式1說明:表示式i+++i++中第二個i的左右兩側都有++,於是我們看第二個i的左側,左側是i+++,可以分解為(i++)+,其中「(i++)」是有值變數,符合x+的形式,因此i+++i++是合法表示式,可以通過編譯。

程式2#include

using namespace std;

int main()

int i=3;

cout<<++i+++i

下面,我們再來討論一下關於i+++i的問題。曾經有人問,表示式i+++i在編譯時,編譯系統是怎麼拆分的?究竟是拆分成(i++)+i呢,還是拆分成i+(++i)。

#include

using namespace std;

int main()

int i=3;

cout

大家可以猜測一下程式的執行結果。

很多人可能會說是7和4,看起來的確像這樣。但是,非常遺憾,實驗再一次證明,你可能猜錯了,結果是8和4.為什麼是8和4呢?

前面說過int i=3;cout<< (++i)+(++i) <下面我們來討論int i=3;cout<

#include

using namespace std;

int main()

int i=3;

cout

很多人認為輸出結果應該是「3 and 4」和5.我們把**複製到vc6.0或vc2005上編譯執行一下,看看結果……

好了,執行結束,結果是「4 and 3」和5.oh!my god!

can you tell me why?上帝不會告訴你,我可以告訴你。這是因為很多編譯系統在處理輸出流時,是從右至左的。

在上面的例子中,兩處i++處於同一個輸出序列中,編譯系統會先計算處於右側的第二個i++,這時i的值為3,因此右側i++的值為3,之後,i+1變成4,計算第一個i++的值為4,計算完之後將i的值再加1,最後才是輸出結果,所以輸出結果是4和3.

4樓:弒緋

1、i++的意思是執行完算式後再執行i的自加。所以這個可以看作是:k=i+i+i,i++,i++,i++。

2、一次進行計算可以得到,k=9,i=6

5樓:匿名使用者

這個表示式的執行是未被良好定義的。在不同的編譯器裡得出的結果不同。例如用gcc編譯,會給出結果是12而不是9,**這個問題意義不大。

6樓:麥家豬

三個括號裡面結果都是3,是同一優先順序的運算,i 的三次賦值,是賦值後帶入後面的運算,賦值是成功了,卻沒有後面後續的運算了!

7樓:神自不凡

我覺得可以這樣理解,i++:先用再加,++i:先加再用,為什麼答案是9,因為用i的初值計算,等全部加完之後,再進行i的加加運算

8樓:何濟遠

換成++i 運算前,執行加1

9樓:匿名使用者

i++就是當他是執行之前的i的值,是3

++i就是用執行之後的值,是6

所以你這個是k=3+3+3=9

你追問裡的那個可以看成k=3+6+3=12

c語言 22.如果i=3,則k=(++i)+(++i)+(i++)執行過後k的值為 ,i的值為 。(1級)

10樓:秋風若飛

i=6;

不知道你是用什麼編譯器編譯的,在vc++裡面k=15;

解釋:++是自加運算子

自加運算子放在前面和後面優先順序是不一樣的,也即是說編譯的時候,(1)先執行的是兩個放在前面的自加運算,運算結果i=5;

(2)計算k值,5+5+5=15

(3)執行放在後面的自加運算,運算結果i=6

11樓:離離原上花開

15由於編譯器從右向左掃描程式分析,是從右向左執行的,如果你學過編譯原理,你就知道了。

下面分析如下,值得注意的是i++,i的值加1,而表示式的值不變.++i,表示式和i都加1

詳細分析如下

// i=3 執行i++後 i++ 值3 i值4// i=4 執行++i後 ++i 值5 i值5// i=5 執行++i後 ++i 值6 i值6這樣分析結果是14,但是vc執行結果是15,不同編譯器結果會不一樣。

所以我現在也很糾結。

求助C語言的問題int i 3則k(iii執行過後k的

這個問題給你說了答案,以後你還會遇到很多次這樣的問題。不如直接告訴你原理來得實在。關於 i,i 的問題看下面看完你再不會,打死我吧!請認真讀完。然後再回來看你這道題。完全就是小兒科。是c 的自增運算子,作用是使變數自加1 是自減運算子,作用是使變數自減1.和 有兩種用法,一種是字首用法,一種是字尾用...

C語言中 for i 0 i 3 ifor(j 0 j 3 j是什麼意思

道清逸森君 這是一個雙重迴圈,通常我們會在迴圈中加個大括號 for i 0 i 3 i 其中i從0到2,i取一個值,j就從0取到2,共迴圈9次 符元綠童書 c語言中 for i 0 i 3 i for j 0 j 3 j 是一個雙重迴圈。for i 0 i 3 i 其中for j 0 j 3 j 是...

C語言程式設計3題求用最簡單的定義語言來寫includestdio h這種的

5.字串處理 include stdafx.h vc 6.0加上這一行.include stdio.h include string.h void delspace char a void countword char p fn 150 a 500 b 200 int i,j,k for k 1,b...