2011-10-04 62 views
5

最近,我翻過一個C++代碼如下所示:不明確的if和else分支:是否定義了行爲?

if(test_1) 
    if(test_2) 
    { 
     // Do stuff 
    } 
    else 
     exit(0); 

這是模糊的,因爲編譯器可以看到這是:

if(test_1) 
{ 
    if(test_2) 
    { 
    } 
    else 
    { 
    } 
} 

或爲:

if(test_1) 
{ 
    if(test_2) 
    { 
    } 
} 
else 
{ 
} 

是此代碼根據任何標準(C,C++)定義的行爲?我在VC++的C++程序中看到了這個代碼,這似乎是首選解決方案。

+3

這不是*模棱兩可*,因爲標準決定了它是如何被解析的,它可能*看起來對你來說模棱兩可,但它不會讓編譯器或其他程序員知道它是如何被解析的。 –

+1

你可能想閱讀:http://en.wikipedia.org/wiki/Dangling_else和這個:http://drdobbs.com/blogs/cpp/231602010。 – sbi

回答

11

是否按照任何標準(C,C++)定義此代碼的行爲?

是的,它被定義。在C(而據我所知所有類似的語言),在「晃來晃去別的」結合到最後免費的,如果,因此這種解釋

if(test_1) 
{ 
    if(test_2) 
    { 
    } 
    else 
    { 
    } 
} 

是正確的。

+8

+1但是作爲一個說明(對於OP),許多人認爲寫作風格總是總是爲了這個(以及其他)原因放置花括號。不是編譯器模糊(不存在),而是模糊和愚蠢。 – xanatos

1

它是明確的。 else總是與最近的可用if配對。

4

沒有歧義。條款else總是指最接近的if它可以附加到。來自C++ standard(6.4選擇語句):

在第6節中,術語子語句指的是包含的語句或語句出現在語法表示法中。選擇語句中的子語句(每個子語句,if語句的其他形式)隱式定義了一個局部範圍(3.3)。

如果選擇語句中的子語句是單個語句而不是複合語句,就好像它被重寫爲包含原始語種的複合語句。 [實施例:

if (x) int i; 

可以等效改寫爲

 if (x) { 
      int i; 
    } 

它隨之而來的是你寫的代碼可以如改寫:

if(test_1) 
{ 
    if(test_2) 
    { 
     // Do stuff 
    } 
    else 
    { 
     exit(0); 
    } 
} 
0

它在C.一種被定義else總是與最近的if配對;因此你應該使用正確的括號來避免含糊不清。