2009-09-16 74 views
24

這裏是一個非常簡單的C++應用程序我QtCreator提出:或無效C++:爲什麼此代碼編譯?

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

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

對我來說,這不是有效的C++,作爲關鍵字不是保留關鍵字。

但是,如果我編譯並運行它,它沒有任何警告正常工作!退出碼是0,如果我改變b = 4,退出碼是1!

我不包括任何東西,以確保沒有隱藏的定義。

這對我來說真的很奇怪。這是Qt定義的東西嗎?我沒有在文檔中找到任何相關內容。

+0

瘋狂!那麼發現+1 – Justicle 2009-09-17 05:47:16

+15

你的意思是什麼?或**是C++中的關鍵字。 – 2009-09-17 06:02:17

+0

@MichaelFoukarakis我認爲*'well spotted' *表示*'爲什麼要編譯這個代碼?'*部分問題:有些編譯器需要'#include '而有些則不需要。大多數(如果不是全部的話)IDE不會突出顯示這些新的「關鍵字」。 – Wolf 2017-01-10 10:35:26

回答

54

根據Wikipedia

C++定義的關鍵字來充當用於多個符號的別名 發揮功能 由於運營商:和(& &),BITAND(&) and_eq(& =) (||),bitor(|)或or_eq (| =),xor(^),xor_eq(^ =),不是(!),not_eq(!=),compl(〜)。

作爲MadKeithV points out,這些替換來自C的iso646.h,並作爲運算符關鍵字包含在ISO C++中。維基百科關於iso646.h的文章說,這些關鍵字的原因確實適用於可能無法輕鬆訪問這些符號的國際和其他非QWERTY鍵盤。

+2

酷 - 我從90年代初開始一直在編寫C++,我對此一無所知。我不太可能會使用它,但很高興知道。 – 2009-09-16 14:42:53

+0

我也不知道,直到我看了。使用起來似乎很尷尬,我確信有很多人在編寫C++並且不知道它。 – 2009-09-16 15:02:45

+1

我相信這些被添加來幫助使用非英語鍵盤的人可能沒有所有的符號鍵(&,|等)。 – KeithB 2009-09-16 15:27:22

16

or是一個C++關鍵字,您可以使用它而不是||。沒有魔法。

and和大多數其他邏輯運算符也是如此。儘管如此,通常最好堅持使用衆所周知的名稱,以避免這樣的混淆。如果你使用or,有人會想知道「爲什麼會這樣編譯」;)

+0

舊的答案,我知道,但我只是想變得很酷和迂腐的一點,他們不是關鍵字,而是替代令牌。男孩我覺得很酷挑剔和討厭。 – GManNickG 2010-01-24 08:18:52

+0

哦對,我沒有意識到這種區別。但是,看起來你是對的。 :) – jalf 2010-01-24 14:37:13

+0

@GManNickG:它們是關鍵字(至少在當前的工作草案中):第C.5.2.3節:「令牌和,和_eq,bitand,bitor,compl,not_eq,not或or_eq,xor和xor_eq是 這個國際標準(2.11)中的關鍵字,它們不是在中定義的宏名稱。「 – Hannes 2016-04-22 11:57:42

7

iso646.h定義了一些操作符替代方案 - 它是C++標準的一部分。

+0

''在C++中爲空。 – avakar 2009-09-16 15:13:31

+2

它不在Visual Studio 2003到2010(http://msdn.microsoft.com/en-us/library/bw6140c5%28VS.80%29.aspx) – 2009-09-16 15:24:51

+0

讓我改述一下:文件是空的,就C++而言編譯器有關。檢查源代碼,你會發現宏沒有被定義爲「__cplusplus」宏。 – avakar 2009-09-17 11:38:03