2009-09-16 42 views
24

Đây là một ứng dụng C++ rất đơn giản, tôi thực hiện với QtCreator:hoặc không hợp lệ C++: tại sao mã này biên dịch?

int main(int argc, char *argv[]) 
{ 
    int a = 1; 
    int b = 2; 

    if (a < 1 or b > 3) 
    { 
     return 1; 
    } 
    return 0; 
} 

Đối với tôi, đây không phải là hợp lệ C++, như từ khóa hoặc không phải là một từ khóa dành riêng.

Nhưng nếu tôi biên dịch và chạy nó, nó hoạt động tốt mà không có bất kỳ cảnh báo nào! Mã thoát là 0 và nếu tôi thay đổi b = 4, mã thoát là 1!

Tôi không bao gồm bất kỳ điều gì để đảm bảo không có xác định ẩn.

Điều này thực sự lạ đối với tôi. Đây có phải là thứ mà Qt đang định nghĩa không? Tôi không tìm thấy bất cứ điều gì trong tài liệu liên quan đến điều đó.

+0

Điên cuồng! Phát hiện tốt +1 – Justicle

+15

Bạn có ý nghĩa gì về phát hiện tốt? hoặc ** là ** một từ khóa trong C++. –

+0

@MichaelFoukarakis Tôi nghĩ * 'well spotted' * có nghĩa là *' tại sao mã này biên dịch? '* Một phần của câu hỏi: Một số trình biên dịch cần '#include ' và một số thì không. Hầu hết (nếu không phải tất cả) IDE không làm nổi bật những "từ khóa" mới này. – Wolf

Trả lời

54

Theo Wikipedia:

C++ xác định từ khóa để đóng vai trò là bí danh đối với một số các biểu tượng có chức năng như các nhà khai thác: và (& &), bitand (&), and_eq (& =) , hoặc (||), bitor (|), hoặc_eq (| =), xor (^), xor_eq (^ =), không (!), not_eq (! =), compl (~).

MadKeithV points out, các thay thế này đến từ ISO iso646.h và được bao gồm trong ISO C++ làm từ khóa của nhà điều hành. Bài viết trên Wikipedia cho iso646.h nói rằng lý do cho những từ khóa này thực sự là cho bàn phím quốc tế và không phải bàn phím QWERTY mà có thể không có quyền truy cập dễ dàng vào các biểu tượng.

+2

Cool - Tôi đã viết C++ từ đầu những năm 90 và tôi không biết gì về điều này. Tôi không có khả năng bao giờ sử dụng nó, nhưng nó là tốt để biết. –

+0

Tôi cũng không biết về nó, cho đến khi tôi nhìn. Nó có vẻ khó xử khi sử dụng, và tôi chắc rằng có rất nhiều người ở đó, những người viết C++ và không biết về nó. –

+1

Tôi tin rằng chúng đã được thêm vào để giúp những người có bàn phím khác ngoài tiếng Anh có thể không có tất cả các phím biểu tượng (&, |, v.v.). – KeithB

16

or là từ khóa C++ và bạn được phép sử dụng nó thay vì ||. Không có phép thuật.

Điều tương tự cũng xảy ra với and và hầu hết các nhà khai thác hợp lý khác. Nói chung tốt nhất là nên gắn bó với các tên thường được biết, để tránh nhầm lẫn như thế này. Nếu bạn sử dụng or, ai đó sẽ tự hỏi "tại sao điều này biên dịch";)

+0

Câu trả lời cũ, tôi biết, nhưng tôi chỉ muốn được mát mẻ và pedantic một điểm ra họ không phải là từ khóa, nhưng thẻ thay thế. Boy làm tôi cảm thấy mát mẻ được picky và gây phiền nhiễu. – GManNickG

+0

Ồ đúng, tôi không nhận ra sự khác biệt đó. Nhưng vâng, có vẻ như bạn đã đúng. :) – jalf

+0

@GManNickG: Chúng là từ khóa (ít nhất là trong bản nháp hiện tại): Phần C.5.2.3: "Mã thông báo và, và_eq, bitand, bitor, compl, not_eq, not, or, or_eq, xor, và xor_eq là các từ khóa trong Tiêu chuẩn này (2.11). Chúng không xuất hiện dưới dạng tên macro được xác định trong . " – Hannes

7

iso646.h xác định một số lựa chọn thay thế nhà điều hành - đó là một phần của tiêu chuẩn C++.

+0

'' trống trong C++. – avakar

+2

Nó không phải là trong Visual Studio 2003 đến 2010 (http://msdn.microsoft.com/en-us/library/bw6140c5%28VS.80%29.aspx) –

+0

Hãy để tôi thuật lại: tệp rỗng trong C++ trình biên dịch là có liên quan. Kiểm tra các nguồn, bạn sẽ thấy rằng các macro có điều kiện trên macro '__cplusplus' không được xác định. – avakar

Các vấn đề liên quan