C ++에서 함수 선언 후에 세미콜론 ( ‘;’)이 필요하지 않습니까? 가고 있다고 생각하기 때문에 내가 틀렸다면 수정하십시오),

나는 최근에 중간 프로그래밍 테스트를 받았고 내가 잘못한 질문 중 하나는 다음과 같습니다.

함수 선언 후에 세미콜론 ( ‘;’)이 필요하지 않습니다.

참 또는 거짓.

나는 “false”를 선택했다 (그리고 내가 미쳐 가고 있다고 생각하기 때문에 내가 틀렸다면 수정하십시오), 함수 선언 은 정의하기 전에 (코드 상단에) 작성하므로 컴파일러는 함수를 알 수 있습니다 호출하기 전에 호출하면 함수 정의 가 함수 전체를 구성하는 것입니다.

즉,

선언:

int func();

정의:

int func() {
  return 1;
}

이것에 대한 대답이 거짓이 아니어야합니까?



답변

한 단계에서 함수를 선언하고 정의하는 상황이있을 수 있습니다 (예 : 함수 정의 지점에 함수 정의를 포함시키는 경우). 그래서 기술적으로 나는 사실이 정확 가정합니다. 그러나 질문은 당신이 한 것처럼 대답했을 것입니다.


답변

“정의는 선언이기도합니다”이외에 다음은 합법적 인 C ++입니다.

int f(), g();

이 두 가지 기능을 선언 f하고 g, 인수없이와의 리턴 타입 모두 int, 그러나의 정의는 f세미콜론 (즉시) 다음되지 않습니다. 마찬가지로 이것은 합법적입니다.

int f(), i = 42;

그러나 실제로 이러한 경우 세미콜론을 완전히 생략하는 것은 허용되지 않으므로 다음 세미콜론없이 선언의 예로 사용 된 경우 다소 놀라운 것입니다. 실제로 다음은 불법입니다.

void *p, f() {}

(단순한) 함수 선언 이외의 함수 정의 는 다른 선언 또는 정의와 동일한 type-specifier에 결합 될 수 없습니다 . (이것이 합법적이라면 a void *p와 a 모두를 정의 할 것 void f() {}입니다.)

어쨌든 이것은 중간 프로그래밍 테스트에 있어서는 안되는 “gotcha”유형의 질문 인 것 같습니다.

(오, 그런데 실제로와 같은 코드를 작성하지 마십시오 int f(), i = 42;.)


답변

다른 답변과 의견은 이것이 끔찍하고 오도되고 잘못 작성된 질문 인 여러 가지 방법을 제시합니다. 그러나 아직 아무도 확인하지 않은 또 다른 문제가 있습니다. 질문은 ~이야:

함수 선언 후에 세미콜론 ( ‘;’)이 필요하지 않습니다. 참 또는 거짓.

자, 함수 선언을 보자.

int func();       /* */
/*           ^       */
/*           |       */
/* That whitespace is "after the function declaration". */

그 모든 것이 선언 입니다. 선언이되지 int func()다음; . 선언 int func();다음에 공백이옵니다.

따라서 질문은 : 선언 후에 세미콜론이 필요한가 ? 당연히 아니지. 선언에는 이미 세미콜론이있어 종료되었습니다. 선언 후 세미콜론은 의미가 없습니다. 반대로 함수 선언 후int func(); ; 세미콜론 이됩니다 .

이 질문은 거의 확실하게 “참 또는 거짓 : 함수 선언의 마지막 토큰은 항상 세미콜론”이라는 질문을하도록 의도되었지만 퀴즈 작성자가 문제에 대해 명확하게 생각하지 않았기 때문에 그들이 쓴 질문은 아닙니다.

내 조언은 프로그래밍 언어 퀴즈를 완전히 피하는 것입니다. 그들은 꽤 끔찍하다.


우리가 주제에있는 동안 재미있는 사실. C #에서는 다음이 모두 합법적입니다.

class C {}
class D {};
struct E {}
struct F {};

C #에서 클래스 또는 구조체 선언은 사용자의 판단에 따라 세미콜론으로 끝나거나 끝나지 않을 수 있습니다. 이 이상한 작은 기능은 C / C ++ 프로그래머가 C #에 온다는 점에서 형식 선언이 무의미한 세미콜론으로 끝나는 기능을 제공합니다. 디자인 팀은이 습관을 가지고 그들을 처벌하고 싶지 않았습니다. 🙂


답변

다음과 같이 함수를 선언 할 수도 있습니다.

int func(){
    return 1;
}

그 진술은 매우 모호하다. 정답은 다음과 같아야합니다. 함수 선언 방법에 따라 다릅니다.

어쨌든, 나는 거짓도 선택했을 것입니다. 아마도 누군가에게 질문을보고 할 수 있습니다.


답변

함수 선언 후에 세미콜론 ( ‘;’)이 필요하지 않습니다.

참 또는 거짓.

맞습니다 . 선언 후에 세미콜론이 필요하지 않습니다. 어떤 정의도 따르지 않습니다. 성명서도 마찬가지입니다.

7 장 [dcl.dcl]의 구문에서 지정한 것처럼 많은 종류의 선언은 세미콜론으로 끝나야합니다. 그러나 그 후에 두 번째를 쓸 필요는 없습니다.


답변

이것은 우리가 함수를 선언하거나 정의하고 있는지에 달려 있습니다. 함수를 선언하는 경우 세미콜론 ( ;) 을 포함해야 하며 함수를 정의하는 경우 세미콜론이 필요하지 않습니다.

선언은 다음과 같습니다 :

int add(int, int);

정의는 다음과 같습니다.

int add(int a, int b)
{
    // ...
}


답변

나는 거의 모든 다른 답변에 동의하지만 질문이 매우 모호하다고 말하고 귀하의 답변이 기술적으로 정확하다고 말하면 다른 관점을 제시 할 수 있습니다.

이것이 내가 항상 전화 한 방법입니다.

void func();  // The function prototype

...

void func()
{
    // The function definition
}

질문 이이 용어를 염두에두고 있다고 가정합니다.

정의와 선언은 내 눈에 같은 개념입니다. “x = y를 정의합니다”== “x = y를 선언합니다”.

물론 함수 프로토 타입 (위)과 함수의 실제 정의에는 큰 차이가 있습니다.