“Else if” có phải là một từ khóa không?


100

Tôi mới làm quen với C ++. Tôi thường thấy câu lệnh điều kiện như dưới đây:

if 
  statement_0;
else if
  statement_1;

Câu hỏi:

Về mặt cú pháp , tôi sẽ coi else ifnhư một từ khóa duy nhất? Hay nó thực sự là một ifcâu lệnh lồng nhau bên trong elsenhư bên dưới?

if 
  statement_0;
else 
  if
    statement_1;

5
Đến điểm thứ hai của bạn. Cú pháp nó hầu như luôn luôn viếtelse if
TheNorthWes

8
Không, vì điều đó sẽ làm cho ngữ pháp vẫn phức tạp hơn: một từ là một từ không có dấu cách. Các ngôn ngữ khác mặc dù có các từ khóa như elseifELIF. Trên thực tế, chỉ (?) Ngôn ngữ lập trình Algol68 cho phép một khoảng trắng trong mã định danh; tốt quá:PROC walk through tree ()
Joop Eggen

3
Fortran (ít nhất là các phiên bản dạng cố định) và tất cả các phiên bản tiêu chuẩn hóa của Algol đều cho phép khoảng trắng ở bất kỳ đâu. Một câu chuyện kể rằng rõ ràng những kẻ đục lỗ thẻ đục lỗ đã có xu hướng thêm khoảng trắng khi nhập mã; khác đơn giản là việc cho phép khoảng trắng trong tên biến sẽ cho phép các lập trình viên sử dụng tên tốt hơn và các vấn đề không được lường trước.
prosfilaes

1
Các elseiftừ khóa tồn tại trong VB và PHP.
Salman A

3
Nitpick: mặc dù C ++ chính thức không có các từ khóa với khoảng trắng trong đó, nhưng nó có các cấu trúc như cho tất cả các ý định và mục đích hoạt động theo cách đó. Ví dụ, long doublebạn phải viết theo cách đó. longdoublelà không chính xác.
Mr Lister

Câu trả lời:


133

Họ không phải là một từ khóa duy nhất nếu chúng ta đi đến dự thảo chuẩn C ++ phần 2.12 Keywords bảng 4liệt kê cả ifelseriêng biệt và không có else iftừ khóa. Chúng ta có thể tìm thấy danh sách các từ khóa C ++ dễ tiếp cận hơn bằng cách chuyển đến phần cppreferences về từ khóa .

Ngữ pháp trong phần 6.4cũng làm rõ điều này:

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

Các iftrong else iflà một tuyên bố sau khi elsehạn. Phần này cũng nói:

[...] Các substatement trong một lựa chọn-tuyên bố (mỗi substatement, trong khác hình thức nếu tuyên bố) ngầm định nghĩa một phạm vi khối (3.3). Nếu câu lệnh con trong một câu lệnh lựa chọn là một câu lệnh đơn chứ không phải một câu lệnh ghép , thì nó giống như thể nó được viết lại thành một câu lệnh ghép có chứa câu lệnh con ban đầu.

và cung cấp ví dụ sau:

if (x)
 int i;

can be equivalently rewritten as

if (x) {  
  int i;
}

Vậy ví dụ mở rộng một chút của bạn được phân tích cú pháp như thế nào?

if 
  statement_0;
else 
  if
    statement_1;
  else
    if
      statement_2 ;

sẽ được phân tích cú pháp như thế này:

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

Ghi chú

Chúng tôi cũng có thể xác định rằng else ifkhông thể là một từ khóa bằng cách nhận ra rằng các từ khóa là số nhận dạng và chúng tôi có thể thấy từ ngữ pháp cho một số nhận dạng trong câu trả lời của tôi cho bạn có thể bắt đầu tên lớp bằng chữ số không? rằng khoảng trắng không được phép trong số nhận dạng và do đó else ifkhông thể là một từ khóa duy nhất mà phải là hai từ khóa riêng biệt .


1
Bạn có thể suy luận điều này mà không có tiêu chuẩn? Trong ASM của nó: jeq( if| else if), jne( if| else if), jmp( else). Dựa trên điều đó, tôi đã nói rằng đó là một từ khóa duy nhất .. có lẽ không phải về mặt cú pháp nhưng theo hướng dẫn.
Brandon

18
@Brandon Tôi thực sự nghi ngờ rằng bạn có thể đi từ hợp ngữ một cách đáng tin cậy đến các cấu trúc cấp cao mà không cần kiến ​​thức sâu sắc về ngữ pháp đang được sử dụng và chính trình biên dịch.
Shafik Yaghmour

Mặc dù làm lưu ý rằng định nghĩa này có khả năng dẫn đến sự tuyệt vời "treo lủng lẳng khác" nhập nhằng vấn đề cây cú pháp khi xác định ngữ pháp trong phân tích cú pháp ...
LinearZoetrope

2
Một số ngôn ngữ không hỗ trợ else if, nhưng thay vào đó elsif. Trong những ngôn ngữ đó, else ifthực sự là một từ khóa. Tuy nhiên, các ngôn ngữ dựa trên C thường không như câu trả lời này.
sfdcfox

1
Tôi nghĩ @Krumia muốn thấy một elsetuyên bố cuối cùng . Tôi cũng sẽ đánh giá cao điều này.
Matthias

78

Về mặt cú pháp, nó không phải là một từ khóa duy nhất; từ khóa không được chứa khoảng trắng. Về mặt logic, khi viết danh sách else if, có lẽ tốt hơn nếu bạn xem nó như một từ khóa duy nhất và viết:

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

Trình biên dịch theo nghĩa đen coi điều này là:

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

nhưng cả hai hình thức đều giống nhau và hình thức đầu tiên dễ đọc hơn nhiều.


1
Trên thực tế, trình biên dịch không thấy elsetheo nghĩa đen là a compound-statement. Sau một else, Nó tìm kiếm statement(có thể giống như return;hoặc f()) hoặc một compound-statement...
The Mask

@TheMask: Theo câu trả lời của Shafik Yaghmour ở trên, trình biên dịch thực sự thấy một câu lệnh đơn lẻ, nhưng giả sử nó nhìn thấy một câu lệnh ghép.
Ilmari Karonen

Câu trả lời này chỉ ra rằng cách trình phân tích cú pháp trích xuất mã thông báo. Tốt.
haccks

24

Không có nó không phải là.
Chúng là hai từ khóa và hơn nữa, "if" thứ hai là một câu lệnh con "bên trong" phạm vi được xác định bởi câu lệnh "else" đầu tiên.


2
Mặc dù điều này mô tả tốt những gì đang diễn ra, bạn có thể muốn thêm một số tham chiếu cho các định nghĩa ngôn ngữ thực tế để chứng minh tốt hơn những gì bạn đang nói.
πάντα ῥεῖ

2
@ πάνταῥεῖ: Bạn nói đúng về các tài liệu tham khảo, nhưng công việc này đã được Shafik Yaghmour thực hiện tốt. Câu trả lời của anh ấy là câu được chấp nhận và tôi cũng đã bỏ phiếu. Công việc của tôi đã hoàn thành ở đây.
pablo1977

16

Bạn có thể xem phạm vi bằng cách sử dụng dấu ngoặc nhọn:

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

Và thường được triển khai với hai từ khóa riêng biệt, một là nếu và một là từ khóa khác .


Vì vậy, tôi cho rằng những người nhấn mạnh rằng dấu ngoặc nhọn nên được sử dụng ở bất cứ nơi nào chấp nhận câu lệnh ghép nên viết tất cả các điều kiện tầm thường của họ như thế này, huh? :)
dlf

5
Tôi nghĩ người ta có thể làm quá mọi thứ, ngay cả những dấu ngoặc nhọn yêu quý của chúng ta. Đừng làm điều này ở nhà.
tuần lộc

1
Tất cả các ngôn ngữ có cấu trúc dấu ngoặc nhọn (mà tôi biết) yêu cầu dấu ngoặc nhọn xung quanh tất cả các câu lệnh con, ngay cả khi bao gồm một câu lệnh duy nhất, đều có một từ khóa mã thông báo đơn với ý nghĩa "khác nếu". Tôi nghĩ điều đó đang nói.
zwol

@Zack: Swift là một ngôn ngữ phá vỡ quy tắc của bạn. Nó yêu cầu dấu ngoặc nhọn ngay cả đối với các khối mã lệnh đơn, nhưng không có từ khóa "else if". Mặt khác, ngữ pháp khá khác với C. An if-statementkết thúc bằng một tùy chọn else-clause. An else-clausemột trong hai else code-block hoặc else if-statement. code-blockbao gồm niềng răng bắt buộc. Vì vậy, elsetừ khóa chỉ có thể được theo sau bởi {hoặc if.
GraniteRobert

@GraniteRobert Tôi chưa có thời gian để xem xét Swift nhiều, nhưng đó là một điểm dữ liệu thú vị; Tôi đã nghĩ rằng một ngữ pháp như thế là một khả năng nhưng chưa bao giờ thấy nó được thực hiện. Và bạn cũng sẽ lưu ý rằng tránh bắt mọi người viết " else { if ... }".
zwol

10

Như đã được trả lời, nó không phải là. Chúng là hai từ khóa. Nó bắt đầu bằng hai câu tiếp nối nhau. Để thử làm cho nó rõ ràng hơn một chút, đây là biểu tượng BNF xử lý ifvà các elsecâu lệnh trong ngôn ngữ C ++.

 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

Lưu ý rằng statementbản thân nó bao gồm selection-statement. Vì vậy, các kết hợp như:

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

có thể và hợp lệ theo tiêu chuẩn / ngữ nghĩa C ++.

Lưu ý: C ++ ngữ pháp mất từ này trang.


1

elseif là hai từ khóa C ++ khác nhau . Một khi tuyên bố có thể được theo sau bởi một tùy chọn khác nếu ... khác tuyên bố. Một khi tuyên bố có thể có không hoặc nhiều else if 's và họ phải đến trước khác .

Bạn có thể tìm thấy cú pháp và ví dụ trong hướng dẫn câu lệnh if ... else này


-1

Tôi chỉ muốn thêm quan điểm của tôi vào tất cả những giải thích này. Theo tôi thấy, nếu bạn có thể sử dụng các từ khóa này một cách riêng biệt, chúng phải là HAI từ khóa. Có thể bạn có thể xem qua ngữ pháp c ++, từ liên kết này trong stackoverflow: Có ngữ pháp C ++ chuẩn không?

Trân trọng


-1

Một câu lệnh if có thể được theo sau bởi một câu lệnh else if ... else tùy chọn, rất hữu ích để kiểm tra các điều kiện khác nhau bằng cách sử dụng câu lệnh if ... else if duy nhất.

Khi sử dụng các câu lệnh if, else if, else có một số điểm cần lưu ý.

Một if có thể không có hoặc một if khác và nó phải đứng sau if khác.

Một if có thể có 0 với nhiều if khác và chúng phải đứng trước if's kia.

Một khi người khác nếu thành công, không ai trong số anh ta còn lại nếu của hoặc của người khác sẽ được kiểm tra.

hãy xem hướng dẫn câu lệnh if ... else .


2
Điều này chỉ không tương ứng với tiêu chuẩn, và hơn nữa, là thừa. Ngôn ngữ có tất cả sức mạnh biểu đạt để mô phỏng else ifnhư thể nó là một từ khóa, vì vậy sẽ không có ý nghĩa gì khi xác định nó một cách rõ ràng.
Ruslan

1
Đây là một sự đơn giản hóa hữu ích cho các lập trình viên. Nhưng câu hỏi không hỏi cách sử dụng câu lệnh if.
Cruncher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.