2016-10-21 3 views
0

이 프로그램의 컴파일 (에 diab와 C) :괄호 안의 문자열이 컴파일되는 이유는 무엇입니까?

이 컴파일러 오류로 간주되지 않습니다 왜
int main() 
{ 

    ("----"); 
} 
  • ? (이 구문을 필요로하는 다른 기능을 지원하기 때문입니까?)
  • 무엇이 컴파일 되나요?
+1

왜 오류가 발생합니까? 이것은 유효한 표현식입니다. 괄호는 컴파일러에게 할당 부족에 대한 경고를 표시하지 않기 만합니다. 데이터 세그먼트의 문자열이있는 빈 프로그램으로 컴파일한다고 가정합니다. – Myst

답변

4

그것은 1;, "----";, 또는 1 + 2 + 3 + 4; 컴파일 것 같은 이유로 컴파일 : 세미콜론 뒤에 표현, 유효한 문이 때문이다.

C의 많은 부분이 작동하려면 세미콜론을 사용하여 표현식을 문장으로 변환해야합니다. 예를 들면 다음과 같습니다.

do_stuff_to(x); 

은 값이 있지만 자체적 인 명령문으로 유용 할 수있는 함수 호출입니다.

x = y; 

같은 무언가조차 (즉 과제입니다) 실제로 표현이다. 이것은 특히 문장의 위치에서 매우 유용합니다. C grammar


관련 부분은 다음과 같습니다

입니다
statement 
    : labeled_statement 
    | compound_statement 
    | expression_statement 
    | selection_statement 
    | iteration_statement 
    | jump_statement 
    ; 

가하는 statementexpression_statement을 포함하여 여러 가지 중 하나가 될 수 있습니다; 이고

expression_statement 
    : ';' 
    | expression ';' 
    ; 

, expression_statement 세미콜론 또는 세미콜론 뒤에 expression 어느이다.


이 프로그램의 컴파일 대상은 구현에 따라 다릅니다. 컴파일러는 문자열을 프로그램의 데이터 세그먼트로 자유롭게 컴파일하거나 단순히 무시할 수 있습니다. 내 컴퓨터에서, GCC는 최적화 된 레벨이없는 경우에도 문자열을 컴파일 된 실행 파일에 전혀 넣지 않습니다.

컴파일러는 플래그 -Wunused-value이 주어지면 GCC가이 구문에 대해 경고하지 않아도됩니다. 이 특별한 구성은 전혀 유용하지 않기 때문에이 경고는 도움이 될 수 있습니다.

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

아주 잘 연결해 주셔서 감사합니다. –

관련 문제