2014-02-25 24 views
0

我在C中有下面的代碼。它正在工作,但我不明白它爲什麼起作用。在我的腦海中,它不應該。正如你所看到的,我正在處理兩個數組,我用數組[i]和數組[j]'抓取'數組中的一個元素。對於數組[j],我只想測試第一個if和第二個if;對於數組[我]我只想測試第二個if,第二個else和最後一個。理解控制流if,else if,else in C

這樣寫的方式看起來不太優雅。在這種情況下最好的做法是什麼?另外,如果評估爲真,C雖然一旦停止測試條件,就會停止測試條件。如果是這種情況,爲什麼代碼在評估第一個else時仍然有效,如果是true;它似乎繼續測試陣列[我]。 (這是我希望它工作的方式;我只是不知道它爲什麼起作用)。

for (int i = 0, j = 0; i <= numChars; ++i) 
{ 
    int index = j % keyNumChars; 

    if (isupper(argv[1][index])) 
    { 
     // execute code A1 
    } 

    else if (islower(argv[1][index])) 
    { 
     // execute code A2 
    } 

    if (isupper(plainText[i])) 
    { 
     // execute code B1 
    } 

    else if (islower(plainText[i])) 
    { 
     // execute code B2 
    } 

    else 
    { 
     //execute code B3 
    } 
} 
+2

它繼續,因爲你有兩個不同的區塊 - 你有一個if語句的else語句之後,因此,無論在其他結果將繼續下一個如果。你的第二塊只會匹配一個if-elseif-else – Andrew

+0

看起來很好看。你不會在邏輯表達式中將它與快捷方式混淆? – mvw

回答

1

第一else去與第一if,和這兩個都與j的測試做。一旦這些完成,執行的路徑就從第二個if開始,因爲它前面沒有else;第二個if,else ifelse走在一起,並與我的測試。這應該解釋爲什麼我的測試和j測試都在工作。

順便說一下,代碼可能需要在某個點增加j;否則它每次都通過測試j = 0。

+0

謝謝。它確實每次增加​​J,如果第二個如果是真的,但不是其他的。首先應該把它改成另一個呢? – user3237895

+0

@ user3237895:否,因爲所有的分支都在同一個循環中,並且在這裏沒有發佈增加'j'的代碼,只有'i'增加。並且'i'不會比平常增加(例如每次執行循環體一次) –

+0

對不起。在B1和B2中,在每個塊中都有一個++ j – user3237895

1

讓我重新

for (int i = 0, j = 0; i <= numChars; ++i) 
{ 
    int index = j % keyNumChars; 

    if (isupper(argv[1][index])) { 
     // execute code A1 
    } else if (islower(argv[1][index])) { 
     // execute code A2 
    } 

    if (isupper(plainText[i])) { 
     // execute code B1 
    } else if (islower(plainText[i])) { 
     // execute code B2 
    } else { 
     //execute code B3 
    } 
} 
+0

這沒有幫助謝謝!所以,只要你開始一個if,它就會獨立於上面的任何東西來處理...... – user3237895

+0

頂級if語句是獨立的。如果只在外層如果在上述構造中失敗,則內層if僅被評估,因此我們落在外層的其他分支中,在那裏我們碰到內層if等等。也許這有助於http://www.macs.hw.ac.uk/~ pjbk /途徑/ CPP1/node99.html – mvw