2017-06-30 19 views
0

我們有一個學校的任務,從C代碼文件中刪除C評論。非常令人困惑的while循環條件

有這個任務要經過輸入文件,循環播放,直到塊註釋結束

*/ 

自帶的方法。

爲什麼這個代碼工作,

while(!(input[i] == '*' && input[i+1] == '/')) 
{ 
    i++; 
} 

但是,這不?

while(input[i] != '*' && input[i+1] != '/') 
{ 
    i++; 
} 

由於某種原因,第二個變體甚至沒有進入循環。我試圖圍繞它思考,但找不到原因爲什麼他們不一樣。

回答

3

!(something AND something)NAND門,他們可以在你的情況來表示,以!something OR !something

所以

while (!(input[i] == '*' && input[i+1] == '/')) { 

相同

//Pick your syntax from these 2 options 
while (input[i] != '*' || input[i+1] != '/') 
while (!(input[i] == '*') || !(input[i+1] == '/')) 

如何過渡從和T o或工作。

現在考慮一下你的NAND門是與輸入X和Y非NOT門的AND門。結果是兩個輸入的AND和AND。爲了區分兩個輸入OR,你必須做下列步驟操作:

 ____  __ 
x --| \ | \ 
    | AND |---|NOT|--- (NAND) 
y --|____/ |__/ 
  • 變化和OR
  • 通過不刪除或者刪除門或否定再次輸出
  • 取反每個輸入separatelly

然後你會得到:

x --- NOT GATE --- \ 
         -- OR GATE -- NOT (from NAND) -- NOT (negate output) 
y --- NOT GATE ---/
  • 如果你想做相反的事情,你可以做到這一點(NOR和AND),只需交換OR和AND以及所有其他步驟。
+0

感謝您澄清。感覺太合乎邏輯了吧!這是錯誤的。 –

0

循環試驗條件下,其與其中表達式的第一或左側第一,看看是否需要檢查第二個也(如果是假評估表達,這意味着我們不需要檢查第二個爲False && anything = False)。

這裏,第一個條件是input[i] != '*'。 這就是爲什麼當字符不是在行首時,循環會在第一次執行時退出。

0

應該還是和不和,

while (input[i] != '*' || input[i+1] != '/') 

,如果我不帶*,然後它不能是塊註釋。 如果我是星*然後如果我不是斜槓'/'那麼它不能是塊評論。

0

在你測試的第一條語句...

(input[i] == '*' && input[i+1] == '/') 

當計算結果爲!真的,你進入循環。爲了這個!真實的你的表達式需要失敗。

在你測試的第二條語句...

input[i] != '*' && input[i+1] != '/' 

當此計算結果爲真,你進入循環。要做到這一點,你需要你的表達成功。

1

你的問題可以通過把它們放在一個真值表

while(!(input[i] == '*' && input[i+1] == '/')) 
{ 
    i++; 
} 

回答產生了與非門的真值表

input[i] input[i+1] Output 
    0   0  1 
    0   1  1 
    1   0  1 
    1   1  0 

while(input[i] != '*' && input[i+1] != '/') 
{ 
    i++; 
} 

產生真值表或非門

input[i] input[i+1] Output 
    0   0  1 
    0   1  0 
    1   0  0 
    1   1  0 

現在您可以很容易地看到兩個while循環產生兩個不同結果的原因。

+0

這更多地闡明瞭這種情況。謝謝你的桌子。 –