2013-02-23 22 views
2

我有以下代碼段:理解無托架用於/如果用C組合/ C++

for (SID_AND_ATTRIBUTES* it = ptg->Groups; end != it; ++it) 
    if (EqualSid(it->Sid, pAdminSid)) 
     break; 

bIsAdmin = end != it; 

不快,當步驟一步在VS調試,最終的線與每個執行用於迭代。我期待上面的代碼段將表現相同:

for (SID_AND_ATTRIBUTES* it = ptg->Groups; end != it; ++it) { 
    if (EqualSid(it->Sid, pAdminSid)) 
     break; 
} 

bIsAdmin = end != it; 

有人可以解釋爲什麼這不是這種情況?

+4

你說得對。不過還有別的,這很奇怪。你只在你的for循環中聲明'it',但它仍然在'bIsAdmin'聲明?這是如何運作的? – 2013-02-23 11:14:13

+0

@RefugnicEternium這是我試圖理解的一段外國代碼的一部分。實際上,「it」沒有在bIsAdmin聲明。我把聲明從for循環中移出來修復了這個特定的問題。但古怪的東西依然存在。 – ARF 2013-02-23 11:17:24

+1

你有沒有檢查過,這不只是你的調試器愚弄你?你有沒有檢查過,價值實際在變化?那怎麼樣,在循環之前設置'bIsAdmin'爲'true'。自然地,在第一次迭代期間,由於「結束」還沒有達到,所以它將它設置爲「假」。 – 2013-02-23 11:19:28

回答

3

當「只有一個分號」時,不需要大括號。儘管我是那些喜歡在代碼中加入大括號的人之一,以防萬一。它從來沒有受傷,真的...

至於步進行爲,我也看到了這一點在Visual Studio和Eclipse調試器。我認爲它反映了「循環的末尾必須在某一行上」 - 所以如果沒有結束大括號,循環內的最後一行包含「循環結束」步驟。令人討厭的確是。