2011-05-23 249 views
4

這可能是一個很小白的問題,但我是這樣做的結果會是什麼:執行順序

int someVariable = 1; 

while (callFunction(someVariable)); 

    if (someVariable = 1) { 
     printf("a1"); 
    } else { 
     printf("a2"); 
    } 

callFunction (int i) { 
    while (i< 100000000) { 
     i++; 
    } 
    return 0; 
} 

所以當你打while循環

while (callFunction(someVariable)); 

做了線程等待那個循環,直到它完成,然後

if(someVariable == 1) { 
    printf("a1"); 
} else { 
    printf("a2"); 
} 

或者它跳過並移動到狀態,則後如果打印「A2」和T他循環完成了再經過if條件嗎?

UPDATE:這不是彪是有效的C代碼只是僞,也許我沒有一句話是正確的,基本上我試圖找出是什麼樣while (callFunction(someVariable));環路之間的不同是VS

while (callFunction(someVariable)){} 

我還改變了我的代碼中的粗體部分ie ** int someVariable = 1; **,我正在做一個無休止的循環,這不是我的意圖。

+2

請縮進代碼。此外,此代碼不是有效的C++,因爲'callFunction'沒有指定返回類型。 – 2011-05-23 08:51:34

+5

什麼是「VM模型」? – 2011-05-23 08:52:25

+2

'callFunction'總是返回'1'。 while循環不會終止。無論是「a1」還是「a2」都不會被打印出來。 – pmg 2011-05-23 08:55:57

回答

2

UPDATE

基本上我試圖找出是什麼樣while (callFunction(someVariable));環路之間的不同是VS while (callFunction(someVariable)){}

沒有實際的區別。 ;劃定一個空的語句,{}是一個沒有語句的範圍。任何編譯器都可以產生相同的代碼。

當然,如果你想要做的事在循環的每次迭代,{}創建「範圍」中,你可以創建類型,typedef和變量以及調用函數:在到達「}」或有未捕獲的異常,本地內容是清理 - 帶有析構函數調用,任何標識/符號使用遺忘編譯器繼續....

原來的答案

這...

callFunction(int i){ 
    while (i< 100000000){ 
     i++; 
    } 
    return 1; 
} 

......只是如果編譯器的優化器沒有刪除循環的基礎上它沒有外部可見的工作 - 也就是說,沒有對狀態的循環的副作用,只是浪費了大量的CPU時間任何其他的「我」,這是無關的,因爲該函數返回,而不再使用我。如果總是返回 「1」,這意味着調用代碼...

while (callFunction(someVariable)); 

...等價於...

while (1) 
    ; 

...這只是循環永遠。

因此,程序的其餘部分 - 此while循環 - 從未執行。

很難猜出你真正想要做什麼。

要獲取編程自己更好 - 瞭解你的代碼的行爲 - 你應該做的一項或兩項:

  • 插入報表輸出到您的程序,所以你可以看到變量的值發生變化隨着程序的執行,及是否退出循環
  • 使用調試器做同樣的
6

函數內部的代碼由一個線程按順序執行。即使你將另一個線程發送給你的函數,它也會執行它的順序。

現在99%的編程語言都是這樣。

+0

有趣的是哪種語言在另外1%?所以我可以避免...;) – Nim 2011-05-23 09:08:30

+1

@Nim:(純粹的)函數式語言通常沒有這些嚴格的順序語義..(但他們也不允許你這樣寫這樣的代碼)。還有專門爲並行和消息傳遞設計的語言,幾乎所有語言都是並行運行,直到達到某個同步點。只有命令式語言真的有「做到這一點,然後做」這種語義 – jalf 2011-05-23 10:14:33

1

你的代碼中包含的任何輸出前一個死循環:

while (callFunction(someVariable)); 

你的意思是爲;在那裏(空循環),還是你 的意思是什麼東西?並不重要:callFunction 總是返回1,它被轉換爲true。 (如果你 真的希望循環是空的,至少把;上 一個單獨的行,其中可以看出)。

如果你獲得超越while(因爲你修改一些代碼 某處) if包含嵌入的分配;這是 基本相同:

if ((someVariable = 1) != 0) 

哪個,當然,總是如此。 (大多數C++編譯器應該 警告嵌入式轉讓或事實if 結果始終爲true,或者兩者兼而有之。)

+0

會有一個區別while(1);和(1){}? – Saad 2011-05-23 16:07:19

+0

@Saad號碼都不是很可讀。 'while'控制一個或多個應該寫在單獨行上的語句,縮進以便讀者可以看到它所控制的內容。 – 2011-05-23 16:53:42

0

如果你的循環結束(它會被依次是的,如果你修復它),它會打印'a1',因爲你在if中做了一個賦值,它總是返回1,對於條件來說它的計算結果爲'true'。