2012-02-03 4 views
0

次のコードスニペットをコンパイルして実行すると、行番号にprintステートメントが出力されると予想されます。 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

コメントは無視されます。あたかもそこにいないかのように。また、あなたの仲間のプログラマーに親切にして、そのようなインデントでそれらを誤解しないようにしてください。 –

+0

@ggaur - 'if'ステートメントの後ろのコードブロックのように、コードブロックの周りに中括弧' {} 'を使用することはうまくいきます。 –

+0

{なし} ifが次の行に当てはまると思います。そうではありません、C++は実際に行について知りません。これは、次のステートメントに適用されます。 – BoBTFish

答えて

1

をあなたはそれの前にif(false)if (false)真と評価決してを持っているので、それが印刷されていません。

+0

それは気の利いたコメントですが、私はそれが良い答えだとは思わない。 –

+0

これは誰もが与えた答えと同じです... –

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 [新しいコード]の条件が満たされることはありません - ライン11のcout

1

コンパイラコメントを無視し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; 

forループ時間後に=私の文を終了し、反復文で次に発生する文は、あります。

誰もが大括弧の慣習に慣れ親しんでいます。私は大文字小文字の区別がないif文を使用することをお勧めします(コメントが必要ない行が1行しかない場合は、括弧を使用します)。

0

コード最適化は、コンパイルのフェーズの1つです。この間、あなたのコメントされたコードは実際にバイナリを生成するコードから削除されます。だから、

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

としてそれを解釈し、あなたがもしそうなら条件内偽を入れている....あなたは結果を知っています。

+0

これはコードからコメントを取り除くプリプロセッサですが、この "コード最適化"という名前は付けません。 –

0

行末はC++では重要ではありません。 ifは、次の ステートメントを制御します。 2番目のケースでは、次の文は出力であり、 なので、出力しないでください。コメントは文ではありません( の実際は実際の解析の前に空白で置き換えられます)。したがって:

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

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

if (false) 


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

は何も出力しません。