2012-02-03 54 views
0

當我編譯下面的代碼片段並運行它時,我期望它在第no行打印語句。 12也是。但那不會發生?爲什麼?編譯器如何在if塊中處理註釋?多行代碼塊在沒有括號的if子句中的奇怪行爲

1 #include <iostream> 
    2 using namespace std; 
    3 
    4 int main() { 
    5  int a; 
    6  if (false) 
    7   cout << "This will not be printed." << endl; 
    8   cout << "This will be printed anyway." << endl; 
    9 
10  if (false) 
11   // comment 
12   cout << "This should also be printed. But not. Why?" << endl; 
13   a = 100; 
14 
15  cout << "a = " << a << endl; 
16 } 

生產:

hyper150:~ 1041$ g++ what_if.cpp 
hyper150:~ 1042$ ./a.out 
This will be printed anyway. 
a = 100 
+5

評論被忽略。彷彿他們甚至不在那裏。另外,請對您的程序員友善,不要以這樣的縮進來誤導他們。 – 2012-02-03 08:13:01

+0

@ggaur - 圍繞代碼塊使用大括號'{}',就像'if' statemens之後的那樣,這是一個非常好的主意。 – 2012-02-03 08:21:09

+0

我想你認爲如果沒有{}適用於下一行。事實並非如此,C++並不真正瞭解線條。它適用於下一個基本上處於下一個狀態的聲明; – BoBTFish 2012-02-03 09:00:25

回答

1

這不是印刷,因爲你在它前面有if(false)if (false)從不計算爲true。

+0

這將是一個機智的評論,但我不認爲這是一個很好的答案。 – 2012-02-03 08:43:24

+0

這與其他人給出的答案是一樣的... – 2012-02-04 00:05:48

4

在生產的本地語言代碼中沒有任何評論的痕跡。

你的代碼是相同的:

1 #include <iostream> 
    2 using namespace std; 
    3 
    4 int main() { 
    5  int a; 
    6  if (false) 
    7   cout << "This will not be printed." << endl; 
    8   cout << "This will be printed anyway." << endl; 
    9 
10  if (false) 
11   cout << "This should also be printed. But not. Why?" << endl; 
12   a = 100; 
13 
14  cout << "a = " << a << endl; 
15 } 

而且,由於在第10行的條件[新代碼]時從來沒有遇到過 - 在cout在第11行從未occures

1

編譯器忽略註釋。

還有一個建議:在if這樣的陳述中,即使只有一個陳述,寫大括號也會更好。

if (false) 
    cout << "This should also be printed. But not. Why?" << endl; 

最好是寫,如:

if (false) 
{ 
    cout << "This should also be printed. But not. Why?" << endl; 
    // Most likely you are going to add more statements here... 
} 
0

如果不使用斗拱,if只需要下一個表達式:

if (false) 
cout << "This will not be printed." << endl; 
cout << "This will be printed anyway." << endl; 

if (false) 
// comment 
cout << "This should also be printed. But not. Why?" << endl; 
a = 100; 

相當於:

if (false) 
{ 
    cout << "This will not be printed." << endl; 
} 
cout << "This will be printed anyway." << endl; 

if (false) 
{ 
    // comment 
    cout << "This should also be printed. But not. Why?" << endl; 
} 
a = 100; 

在實際編譯之前很久就刪除了註釋。

0

如果不使用大括號來包圍條件結果,則條件結果將以下一個語句的結尾終止,這通常意味着;字符。

但它不僅是;性格,因爲你可以做到這一點(這實在是太可怕了閱讀):

if (true) 
    for(int i = 0; i < 5; i++) 
     if (i == 4) 
     break; 
     else 
     h = i; 

在這種情況下,爲循環是下一個出現的說法,這是一個迭代,聲明終止小時後=我的發言。

每個人都有自己的口味與括號約定 - 我更喜歡使用無括號的if語句,只有在它下面只有一行不需要註釋(如果還有其他語句,則使用括號)。

0

代碼優化是編譯階段之一。在此期間,您的註釋代碼將從實際生成二進制文件的代碼中刪除。所以它將其解釋爲:

if (false) 
    cout << "This should also be printed. But not. Why?" << endl; 

而且你在if條件中放了一個假,所以....你知道後果。

+0

這是預處理器,它從代碼中去除了註釋,我不會將其命名爲「代碼優化」。 – 2012-02-03 08:56:54

0

C++中行結束符不重要; if控制以下 語句。在第二種情況下,以下語句是輸出 ,因此不應該打印。註釋不是語句(在實際解析之前, 事實替換爲空格)。因此:

if (false) std::cout << "no" << std::endl; 

if (false) 
    std::cout << "no" << std::endl; 

if (false) 


    std::cout << "no" << std::endl; 

將不輸出任何內容。