"else if"는 단일 키워드입니까?


100

저는 C ++를 처음 사용합니다. 나는 종종 아래와 같은 조건문을 본다.

if 
  statement_0;
else if
  statement_1;

질문:

구문 적else if 으로는 단일 키워드로 취급해야 합니까? 아니면 실제로 if외부else 아래와 같이 입니까?

if 
  statement_0;
else 
  if
    statement_1;

5
두 번째 요점으로. 구문이 거의되어 항상 작성else if
TheNorthWes

8
아니오, 문법이 더 복잡해 지므로 단어는 공백이없는 단어입니다. 다른 언어 그래도 같은 키워드를 가지고 elseifELIF. 사실 (?) 프로그래밍 언어 Algol68은 식별자에 공백을 허용합니다. 너무 좋다 :PROC walk through tree ()
Joop Eggen

3
Fortran (적어도 고정 된 형식 버전) 및 모든 표준화 된 Algol 버전은 어디에서나 공백을 허용합니다. 한 이야기에 따르면 펀치 카드 펀처는 코드를 입력 할 때 공백을 추가하는 경향이 있습니다. 다른 하나는 변수 이름에 공백을 허용하면 프로그래머가 더 나은 이름을 사용할 수 있고 문제가 예상되지 않았습니다.
prosfilaes

1
elseif키워드는 VB와 PHP 존재합니다.
Salman A

3
Nitpick : C ++에는 공식적 으로 공백이 포함 된 키워드가 없지만 모든 의도와 목적에 맞는 구조가 있습니다. 예를 들어,, long double당신은 그렇게 작성해야합니다. longdouble부정확하다.
Mr Lister

답변:


133

우리가에 가면 그들은 하나의 키워드 아닌 초안 C ++ 표준 섹션 2.12 키워드 테이블 4목록을 모두 ifelse별도로 더이없는 else if키워드가. 키워드 에 대한 cppreferences 섹션으로 이동하여 더 접근하기 쉬운 C ++ 키워드 목록을 찾을 수 있습니다. .

섹션의 문법 6.4은이를 명확하게합니다.

selection-statement:
 if ( condition ) statement
 if ( condition ) statement else statement

if의는 else ifA는 다음 else용어. 이 섹션은 또한 다음과 같이 말합니다.

[...] 선택 문의 하위 ( if 문의 else 형식의 각 하위 문)은 암시 적으로 블록 범위 (3.3)를 정의합니다. selection-statement의 하위 문이 복합 문이 아닌 단일 문 이면 원래 하위 문을 포함하는 복합 문으로 다시 작성된 것과 같습니다.

다음 예제를 제공합니다.

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

그렇다면 약간 확장 된 예제는 어떻게 구문 분석됩니까?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

다음과 같이 구문 분석됩니다.

if 
{
  statement_0;
}
else
{ 
    if
    {
      statement_1;
    }
    else
    {
        if
        {
         statement_2 ;
        }
    }
}

노트

우리는 또한 결정할 수 else if실현에 의해 하나 개의 키워드가 될 수없는 키워드가 있습니다 식별자 우리는 내 대답 식별자의 문법에서 볼 수있는 당신이 숫자 숫자로 클래스 이름을 시작할 수 있습니까? 공간이 허용되지 않습니다 식별자 너무 그러므로과 else if하나가 될 수 없습니다 키워드 하지만 두 개의 별도해야합니다 키워드 .


1
표준없이 이것을 추론 할 수 있습니까? ASM에서는 jeq( if| else if), jne( if| else if), jmp( else). 그것을 바탕으로 나는 그것이 하나의 키워드라고 말했을 것입니다.
Brandon

18
@Brandon 사용되는 문법과 컴파일러 자체에 대한 친밀한 지식 없이도 어셈블리 언어에서 높은 수준의 구조로 안정적으로 이동할 수 있을지 의심됩니다.
Shafik Yaghmour 2014-06-24

비록 파서에서 문법을 정의 할 때 멋진이 정의는 잠재적으로 리드 ... 모호한 구문 트리의 문제를 "다른 매달려"주의 할
LinearZoetrope

2
일부 언어는 지원하지 else if않지만 대신 elsif. 이러한 언어에서는 else if진정으로 하나의 키워드입니다. 그러나 C 기반 언어는 일반적으로 그렇지 않습니다.
sfdcfox 2014-06-25

1
@Krumia가 최종 else진술 을보고 싶었다고 생각 합니다. 이것도 고맙게 생각합니다.
Matthias

78

구문 적으로는 단일 키워드가 아닙니다. 키워드는 공백을 포함 할 수 없습니다. 목록을 작성할 때 논리적으로, else if경우에, 아마 더 나은 당신이 하나의 키워드 및 쓰기로 참조 :

if ( c1 ) {
    //  ...
} else if ( c2 ) {
    //  ...
} else if ( c3 ) {
    //  ...
} else if ( c4 ) {
    //  ...
} // ...

컴파일러는 말 그대로 이것을 다음과 같이 봅니다.

if ( c1 ) {
    //  ...
} else {
    if ( c2 ) {
        //  ...
    } else {
        if ( c3 ) {
            //  ...
        } else {
            if ( c4 ) {
                //  ...
            } // ...
        }
    }
}

그러나 두 형식 모두 같은 결과를 내고 첫 번째 형식은 훨씬 더 읽기 쉽습니다.


1
실제로 컴파일러는 문자 그대로 else뒤에 compound-statement. 애프터 else, 그것은을 찾아 statement(처럼 될 수있는 return;f()) 또는 compound-statement...
가면

@TheMask : 위의 Shafik Yaghmour의 대답에 따르면 컴파일러는 문자 그대로 단일 문을 보지만 복합 문을 본 것처럼 가장 합니다.
Ilmari 카로 넨

이 답변은 파서가 토큰을 추출하는 방법을 나타냅니다. 좋은.
haccks

24

전혀 그렇지 않다.
두 개의 키워드이며 두 번째 "if"는 첫 번째 "else"문에 의해 결정된 범위 "내부"하위 문입니다.


2
이것이 무슨 일이 일어나고 있는지 잘 설명하고 있지만, 당신이 말하는 것을 더 잘 증명하기 위해 실제 언어 정의에 대한 몇 가지 참조를 추가 할 수 있습니다.
πάντα ῥεῖ 2014-06-23

2
@ πάνταῥεῖ : 참고 문헌에 대해서는 맞지만이 작업은 Shafik Yaghmour에 의해 아직 잘 수행되었습니다. 그의 대답은 받아 들여졌고 저도 투표했습니다. 내 일은 여기서 끝났어.
pablo1977 2014-06-23

16

중괄호를 사용하여 범위를 볼 수 있습니다.

if(X) {
  statement_0;
}
else {
  if(Y) {
    statement_1;
  }  
}

그리고 일반적으로 두 개의 별개 키워드로 구현됩니다. 하나는 if 이고 다른 하나는 else 입니다.


그래서 나는 복합 문이 받아 들여질 때마다 중괄호를 사용해야한다고 주장하는 사람들은 모든 사소하지 않은 조건문을 이렇게 작성해야한다고 생각합니다. :)
dlf 2014-06-23

5
나는 우리가 사랑하는 중괄호조차도 과장 할 수 있다고 생각합니다. 집에서하지 마십시오.
순록

1
모든 하위 문 주위에 중괄호 가 필요한 모든 중괄호 구조 언어 (내가 알고있는) 는 단일 문으로 구성되어 있더라도 "else if"를 의미하는 단일 토큰 키워드를가집니다. 나는 그것이 말하고 있다고 생각한다.
zwol

@Zack : Swift는 규칙을 어기는 언어입니다. 단일 문 코드 블록에도 중괄호가 필요하지만 "else if"키워드는 없습니다. 반면에 문법은 C if-statement와 상당히 다릅니다. An 은 옵션으로 끝납니다 else-clause. 는 else-clause것입니다 중 하나 else code-block 또는 else if-statement. code-block필수 중괄호가 포함됩니다. 따라서 else키워드 뒤에 {또는 만 올 수 있습니다 if.
GraniteRobert 2014-06-25

@GraniteRobert 나 자신이 Swift를 많이 볼 시간이 없었지만 그것은 흥미로운 데이터 포인트입니다. 나는 그와 같은 문법이 가능성 이라고 생각하고 있었지만 그것이 완성되는 것을 보지 못했습니다. 또한 사람들이 " else { if ... }"를 쓰게 만드는 것을 피할 수 있습니다.
zwol 2014-06-25

10

이미 대답했듯이 그렇지 않습니다. 두 가지 키워드입니다. 서로 뒤 따르는 두 문장의 시작입니다. 좀 더 명확하게하기 위해 C ++ 언어로 ifelse명령문 을 다루는 BNF gramar가 있습니다.

 statement:      
    labeled-statement
    attribute-specifier-seqopt expression-statement
    attribute-specifier-seqopt compound-statement    
    attribute-specifier-seqopt selection-statement  
    attribute-specifier-seqopt iteration-statement    
    attribute-specifier-seqopt jump-statement  
    declaration-statement
    attribute-specifier-seqopt try-block

   selection-statement: 
         if ( condition ) statement
     if ( condition ) statement else statement

참고 statement자체가 포함 selection-statement. 따라서 다음과 같은 조합 :

if (cond1)
   stat
else if(cond2)
   stat
else
   stat

C ++ 표준 / 의미에 따라 가능하고 유효합니다.

참고 : C ++ 문법은 페이지 에서 가져옵니다 .


1

elseif 는 두 개의 다른 C ++ 키워드 입니다. 경우 문이 옵션 다음에 할 수 있습니다 다른 경우 ... 다른 문. 경우 문은 0 개 이상있을 수 있습니다 다른 경우 의 그리고 그들은 앞에 와야합니다 다른 .

if ... else 문 자습서 에서 구문과 예제를 찾을 수 있습니다.


-1

이 모든 설명에 내 관점을 추가하고 싶습니다. 보시다시피이 키워드를 따로 사용할 수 있다면 두 개의 키워드 여야합니다. stackoverflow의이 링크에서 C ++ 문법을 살펴볼 수 있습니다 . 표준 C ++ 문법이 있습니까?

문안 인사


-1

if 문 뒤에는 선택 사항 인 else if ... else 문이 올 수 있습니다. 이는 단일 if ... else if 문을 사용하여 다양한 조건을 테스트하는 데 매우 유용합니다.

if, else if, else 문을 사용할 때 염두에 두어야 할 몇 가지 사항이 있습니다.

if는 0 개 또는 1 개를 가질 수 있으며 다른 경우 뒤에 와야합니다.

if는 0에서 많은 다른 if를 가질 수 있으며 else 앞에 와야합니다.

다른 사람이 성공하면 다른 사람은 테스트를 거치지 않습니다.

if ... else 문 자습서를 살펴보십시오 .


2
이것은 표준에 해당하지 않으며 중복됩니다. 언어는 else if마치 키워드 인 것처럼 시뮬레이션 할 수있는 모든 표현력을 가지고 있으므로 명시 적으로 정의하는 것은 의미가 없습니다.
Ruslan

1
이것은 프로그래머에게 유용한 단순화입니다. 그러나 질문은 if 문을 사용하는 방법을 묻는 것이 아닙니다.
Cruncher 2014-06-25
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.