2016-10-21 10 views
0

このプログラムのコンパイル(DIABとC):括弧内の文字列がコンパイルされ、コンパイルされるのはなぜですか?

int main() 
{ 

    ("----"); 
} 
  • は、なぜそれがコンパイルエラーとはみなされませんか? (なぜなら、この構文を必要とする他の機能をサポートしているからですか?)
  • これは何にコンパイルされますか?
+1

なぜエラーになるのですか?これは有効な式です。かっこは単に、割り当ての不足についての警告を出さないようにコンパイラに指示します。私はそれがデータセグメントの文字列で空のプログラムにコンパイルすると仮定します。 – Myst

答えて

4

それは1;"----";、または1 + 2 + 3 + 4;をコンパイルするのと同じ理由でコンパイルします。セミコロンが続く式が、有効な文ですので。

Cの多くの部分が機能するには、式をセミコロンで記述する必要があります。たとえば、

do_stuff_to(x); 

は、値を持ちますが、それ自体の文としては便利な関数呼び出しです。でも

x = y; 

のようなもの(つまり、割り当てである)、実際に式です。これは特にステートメントの位置では非常に便利です。


C grammarの関連部分は、以下のとおりです。statementexpression_statementを含む多くのもの、のいずれかにすることができ、

statement 
    : labeled_statement 
    | compound_statement 
    | expression_statement 
    | selection_statement 
    | iteration_statement 
    | jump_statement 
    ; 

です。そして、expression_statementある

expression_statement 
    : ';' 
    | expression ';' 
    ; 

は、セミコロンに続く、セミコロン又はexpressionのいずれかです。


このプログラムがコンパイルするのは実装に依存します。コンパイラは、文字列をプログラムのデータセグメントに自由にコンパイルすることも、単純に無視することもできます。私のマシンでは、最適化レベルがなくても、GCCは文字列をコンパイルされた実行可能ファイルに入れません。

コンパイラは、この構造について警告する必要はありませんが、フラグ-Wunused-valueが与えられている場合、GCCは警告を発しません。この特別な構成はまったく役に立たないので、この警告は時々役立つことがあります。

test.c: In function ‘main’: 
test.c:2:5: warning: statement with no effect [-Wunused-value] 
    ("----"); 
    ^
+0

非常によく関節がつながっています、ありがとう –

関連する問題