2009-11-13 4 views
9

아래 프로그램을 확인하십시오.C 퍼즐 - 유형별 게임

#include <stdio.h> 

struct st 
{ 
int a ; 
} 

fn() 
{ 
struct st obj ; 
obj.a = 10 ; 

return obj ; 
} 

int main() 
{ 
struct st obj = fn() ; 

printf ("%d", obj.a) ; 
} 

질문

  1. 프로그램의 출력은 무엇입니까

    는 다음과 같습니다?
  2. 여기서 ';'는 'struct st'선언을 종결 하시겠습니까?

    ISO IEC 9899 - 1999 사양으로 선언하면 은 ';'로 끝나야합니다. '구조체 일'의 선언 기능 'FN'의 반환 형식을 나타내는 촬영하는 경우

    declaration-specifiers init-declarator-listopt ; 
    
  3. , 어떻게 볼 다른 기능 (주)에인가?

+0

; struct 다음에 fn()에도 반환 유형이 없습니다. – foraidt

+0

숙제? ;) 나는 출력이 10 진수로 서식이 있다고 생각한다. (나는 % d의 의미라고 생각한다.) – invert

+0

구체적으로 말하고있다 : 3 행 : 오류 : 형식 정의가 함수 반환 형식 선언에 허용되지 않는다. – foraidt

답변

5

상황이 좀 더 명확 할 수있다. 구조체 유형이 함수 정의의 일부이기 때문에 구조체 정의 뒤에 세미콜론이 없습니다 (translation-unit ->top-level-declaration ->function-definition의 문법을 통해 추적). 구조체 유형은 main()에 사용할 수 있습니다. 왜냐하면 구조체 태그를 st (st)에 배치했기 때문입니다. 당신이 썼다면

struct { int a; } fn() {...} 

이 유형은 main()에 사용할 수 없었을 것입니다. 동일한 정의로 새로운 구조체 유형을 만들어야했습니다. 당신이 쓴 것처럼

는 동일한 효과를 얻을

struct st { 
    int a; 
}; 

struct st fn() 
{ 
    /* same as before */ 
} 

int main() 
{ 
    /* same as before */ 
} 
꼬모 누락에 대해 불평
9
  1. 출력은 10
  2. 이 모든 것은 함수 정의이기 때문에 세미콜론이있을 필요가없는 것입니다.
  3. 구조 태그 st은 전역 범위에서 선언되므로 main에서 볼 수 있습니다.

    struct st { int a; } fn() 
    { 
        struct st obj; 
        obj.a = 10; 
        return obj; 
    } 
    int main() 
    { 
        struct st obj = fn(); 
        printf("%d\n", obj.a); 
        return 0; 
    } 
    

    따라서, fn()의 반환 형식이 struct st {int a;}입니다 : 우리는 코드를 조금 다시 포맷하는 경우

+0

정확히 내가 쓰려고했던 +1. –

+0

4. GCC는 내가 생각한 것보다 조금 더 관대하다. –