programing

오류: int 이전의 식이 필요합니다.

skycolor 2023. 9. 9. 09:14
반응형

오류: int 이전의 식이 필요합니다.

다음 코드를 시도해보니 오류가 발생합니다.

if(a==1)
  int b =10;

그러나 다음은 구문론적으로 정확합니다.

if(a==1)
{
   int b = 10;
}

왜 이러한가?

이것은 사실 상당히 흥미로운 질문입니다.처음 보는 것처럼 간단하지 않습니다.참고로 N1570에 정의된 최신 C11 언어 문법을 바탕으로 하겠습니다.

이 질문의 직관에 어긋나는 부분은 다음과 같습니다. 이것이 맞다면 C:

if (a == 1) {
  int b = 10;
}

그렇다면 왜 이것 또한 C가 맞지 않는 것일까요?

if (a == 1)
  int b = 10;

내 말은, 한 줄 조건이if교정기가 있든 없든 진술은 괜찮겠죠?

답은 문법에 있습니다.ifC 표준에 의해 정의된 바와 같이 진술.제가 아래에 인용한 문법의 관련 부분입니다.간단히 말해:int b = 10line은 선언이지, 진술이 아닙니다, 그리고 문법입니다.if진술서는 시험 중이라는 조건 뒤에 진술서가 필요합니다.하지만 선언문을 괄호 안에 넣으면 진술문이 되고 모든 것이 잘 됩니다.

그리고 질문에 완벽하게 대답하기 위해서 말이죠. 이건 범위와는 상관없는 일이 없어요.b해당 범위 안에 존재하는 변수는 해당 범위 밖에서 액세스할 수 없지만 프로그램은 구문적으로 여전히 정확합니다.엄밀하게 말하면, 컴파일러가 오류를 던져서는 안 됩니다.물론, 당신은 당신과 함께 건설해야 합니다.-Wall -Werror어쨌든 ;-)

(6.7) 선언:선언-지정자 init-admicator-listopt;정적_중복사
(6.7) init-acculator-list:초기계산기init-admator-list, init-admator
(6.7) init-acculator:선언자선언자 = 이니셜라이저
(6.8) :표식이 있는복합적인표현문선택문반복 진술깡충깡충 뛰다p-statement
(6.8.2) 복합 문:{블록-항목-목록opt }
(6.8.4) 선택문:if () 문장if () other statementswitch ()

{ }-->

하므로 를 합니다 합니다.if(a==1) { int b = 10; }{} - 이 범위에 대해 int b를 정의하고 있다고 합니다.

if(a==1)
  int b =10;

범위가 없습니다.그리고 당신은 사용할 수 없을 것입니다.b아무 곳이나.

C89에서는 블록의 맨 위에서만 변수를 정의할 수 있습니다.

if (a == 1)
    int b = 10;   // it's just a statement, syntacitially error 

if (a == 1)
{                  // refer to the beginning of a local block 
    int b = 10;    // at the top of the local block, syntacitially correct
}                  // refer to the end of a local block

if (a == 1)
{
    func();
    int b = 10;    // not at the top of the local block, syntacitially error, I guess
}

언급URL : https://stackoverflow.com/questions/22419790/c-error-expected-expression-before-int

반응형