2016-04-04 5 views
3

私は、コンパイラはエラー2セミコロンを入れるのはエラーではないのですか?

#include <iostream> 

int main() 
{ 
    int x; 
    x = 5;; 
    std::cout << x;;; 
} 

せずにコンパイルされますどのように多くのセミコロン(複数の場合は0)に関係なく正常に動作しますので、なぜだろうことを見つけますか?

+0

C++構文では、空文を使用できます。 - (なぜ、おそらくCから継承) –

+3

これは、Cが、同じ理由である:http://stackoverflow.com/questions/10876776/why-can-you-use-multiple-semicolons-in-c – NathanOliver

+6

@ f.Alessio - これはすべてのインスタンスで真実ではないことに注意してください。たとえば、 'if(condition)statement ;; else文 'が失敗します。 – owacoder

答えて

5

言語標準でそう言われているので間違いではありません。空文を持っていても何もせず、無害です。

回、それは便利ですがあります。

#ifdef DEBUG 
#include <iostream> 
#define DEBUG_LOG(X) std::cout << X << std::endl; 
#else 
#define DEBUG_LOG(X) 
#endif 

int main() 
{ 
    DEBUG_LOG(1); 
} 

DEBUGが、これはに拡大する定義されていない:あなたがコンパイルされないでしょう、空の文を持っていなかった場合

int main() 
{ 
    ; 
} 

が。

+0

これはマクロを使った素晴らしいトリックですが、 'do std :: cout << X << std :: endl; (0) 'は、セミコロンについて余分な警告が出るのを避けるためです。 – HolyBlackCat

+1

はい、それは実際のプログラムで書いています(警告ではなく、if/elseの後で正しく使用できるためです)。しかし、私はそのアイデアを簡単に説明したいと思いました。 –

2

セミコロンは文を終了し、連続したセミコロンは操作/空文を表しません。

空文のコードは生成されません。

3

セミコロンは、ターミナルであり、何かを終了させるトークンです。正確に終了するのは文脈によって異なります。発現ステートメントで、発現が任意であること

an expression-statement 
a do/while iteration-statement 
the various jump-statements 
the simple-declaration 

注: 例えば、セミコロン文字はC++文法の次の部分(必ずしも完全なリスト)の端部にあります。だからこそ、セミコロン(;;;;)の「実行」は、単一のものが存在する多くの場所(ただしすべてではない)で有効です。

1

2つの連続したセミコロンがある場合は、それらの間に空のステートメントがあります(間にステートメントはありません)。だから、なぜ空文が許可されていますか?

言語によっては文が必要な構文を使用する必要がある場合もありますが、文を提供する必要はありません。例えば、無限ループを記述するための一般的な方法は、この

for (;;) { 
    // do something 
    // ...and break somewhere 
} 

のようなものであるC++のdidntが空文を許可している場合、私たちは、この仕事をするためにいくつかのダミーステートメントの代わりに、裸;;を入れなければならないでしょう。

0

​​の間に空文があります。 C++は空白を気にしません。

関連する問題