2013-06-28 93 views
21

我正在計算兩個整數的最大公分母。「&&」和「和」運算符C

C代碼:

#include <stdio.h> 

int gcd(int x, int y); 

int main() 
{ 
    int m,n,temp; 
    printf("Enter two integers: \n"); 
    scanf("%d%d",&m,&n); 
    printf("GCD of %d & %d is = %d",m,n,gcd(m,n)); 
    return 0; 
} 

int gcd(int x, int y) 
{ 
    int i,j,temp1,temp2; 

    for(i =1; i <= (x<y ? x:y); i++) 
    { 
     temp1 = x%i; 
     temp2 = y%i; 
     if(temp1 ==0 and temp2 == 0) 
      j = i; 
    } 
    return j;   
} 

在if語句,注意邏輯運算符。這是and而不是&&(錯誤)。該代碼沒有任何警告或錯誤。

C中是否有and運算符?我正在使用orwellDev-C++ 5.4.2(在c99模式下)。

回答

9

退房的頁面在這裏iso646.h

這個頭文件定義了11名宏觀的是一些常見的運營商的文本等價物。 and是其中的一個定義。

請注意,我只能對C++編譯器進行測試,所以我不確定您是否可以使用嚴格的C編譯器。

編輯我剛剛用C編譯器here進行了測試,它確實有效。

+1

@chollida;給定的鏈接以適當的方式解釋事物。感謝鏈接。 您的回答應該被接受。 – haccks

+2

在C++中,''頭是無操作的;關鍵字是C++中的關鍵字,不包含任何頭文件。 –

7

基本上and只是&&的文本版本。 但是,您的確需要#include <iso646.h>。或者它不會編譯。

你可以在這裏閱讀更多:
http://msdn.microsoft.com/en-us/library/c6s3h5a7%28v=vs.80%29.aspx

+0

請注意,您提供的鏈接適用於C++編譯器,而不是海報所示的C編譯器。 – chollida

+0

但是我知道它仍然是正確的.C++和C通常非常相似,它處理這些相似之處。 – Thijser

+0

@ Thijser;感謝您的鏈接。你的答案只有在解釋關於宏的時候,因爲把'.c'擴展名改爲'.cpp',它的作用就像它自己宏一樣。 +1。 – haccks

3

這是編譯給你,因爲我認爲你包括iso646.h(ciso646.h)頭文件。根據它和& &相同。如果不包含它會導致編譯器錯誤。

+0

我沒有包含'iso646.h'。 – haccks

+0

對我來說,它是給編譯器錯誤,如果我不包括iso646.h文件。如果我包含它,它正在編譯成功。 – Chinna

+0

它會!將擴展名'.c'改爲'.cpp',然後可以在不包含'iso646.h'的情況下工作。 – haccks

3

and操作者是文本等效&& REF- AND Operator

or操作者的在所述等效文本的|| Ref.- OR Operator

所以resAresB是相同的。

22

&&and備用令牌和在功能上是相同的,從部分2.6替代令牌C++ draft standard

Alternative Primary 
    and  && 

是在表2中的條目中的一個 - 替代令牌和它在第2小節中說:

在各方面的語言,每個人除了它的拼寫,除了它的主要標記外,其他標記的行爲也是相同的。表2中定義了一組替代令牌。

由於Potatoswatter指出,使用and很可能會迷惑大多數人,所以它可能是更好堅持&&

重要的是要注意,在Visual Studiois not complaint in C++和顯然不打算。

編輯

我加入一個C具體的答案,因爲這原本是回答了C++的問題,但被merged我從C99 draft standard這是加入相關報價部分7.9的拼寫方式<iso646.h>款1表示:

的標頭定義擴大 到相應的令牌(在右側)下列十宏(左側):

,包括這條線以及其他幾個人:

and && 

我們也可以找到一個很好的參考here

更新

看你的最新代碼更新,我不知道,你真的在​​C模式下編譯時,release notes爲OrwellDev 5.4.2說,它正在使用GCC 4.7.2。我無法使用-x c將其編譯爲gcc-4.7gcc-4.8以將其放入C語言模式,請參閱live code here。雖然如果你評論gcc行並使用g++它確定。如果您取消註釋#include <iso646.h>

+4

呃,另一個區別是,當你寫'和'時,大多數讀者會感到困惑。特別是如果你把它寫在例如'int a,b和c = a;' – Potatoswatter

+1

@Patatoswatter這是一個公平點。 –

+6

我不同意這是「大多數讀者」的混淆。對於那些認識C和C++的人來說,看到'&&'但不知道替代令牌(或者在C的情況下是iso646.h),這隻會令人迷惑。對於那些瞭解替代標記(稀有)或者開始出現的人(我認爲它對後者實際上會更不容易混淆,並且可能是數字最大的羣體),這並不會讓人困惑。 – Joe

8

and只是&&的替代標記,它也可以在gcc之下生成。

我們可以很容易地在這裏引用標準:

2.6候選標記[lex.digraph]

在語言的各個方面,各個替代令牌行爲相同,分別爲主令牌,除了拼寫。該組的候選標記在表2中

定義在表2中:

Alternative | Primary 
     and | && 

但我建議你使用&&。用C/C++的人可能會被混淆and ...


既然是合併現在,我們也在談論C,可以通過這個頁面ciso646定義替代令牌。

此標題爲ISO646標準字符集不支持的那些C++運算符定義了11個宏常量,並提供了替代拼寫。

從C99標準草案:

7.9備選拼寫<iso646.h>

報頭解音響未列名展開 到相應的令牌下列十宏(左側)(在右):

and && 
+0

您是否認爲ANSI適用於「標準」? – paykoob

+1

@paykoob我的意思是[C++標準草案](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf)。 –

+0

它也符合ISO/IEC 14882:1998/2011標準 – Joe

2

&&and是同義詞,表示在C++中的邏輯AND。欲瞭解更多信息,請查詢Logical Operators in C++Operator Synonyms in C++

+0

'和'也可以表示右值引用。或者你可以有'操作員和'。我們處於模棱兩可的境地。 – Potatoswatter

+0

@Potatoswatter你能澄清'rvalue reference'評論嗎? –

+0

@ShafikYaghmour這是自C++ 11以來的新功能。如果用'&'聲明舊樣式的「左值」引用,則用&&'聲明右值引用。這就是我在你的回答下的評論中用於語法憎惡的地方。 – Potatoswatter

4

如果您的問題中的代碼編譯沒有錯誤,或者您沒有真正在C99模式下編譯或(不太可能)您的編譯器是越野車。或者代碼不完整,並且您沒有向我們顯示#include <iso646.h>

很可能你實際上是在C++模式下調用你的編譯器。要測試這一點,請嘗試添加如下聲明:

int class; 

C編譯器會接受這個;由於class是關鍵字,因此C++編譯器會將其作爲語法錯誤拒絕。 (這可能是不是測試__cplusplus宏更可靠的比特;錯誤配置的顯影系統可以設想調用一個C++編譯器在C模式中的預處理器。)

在C99中,頭<iso646.h>定義了11個宏提供用於可選拼寫某些運營商。其中之一是

#define and && 

所以,你可以寫

if(temp1 ==0 and temp2 == 0) 
在僅C

如果你有一個#include <iso646.h>;否則它是一個語法錯誤。

<iso646.h>是1995年對1990 ISO ISO標準的修正後添加到語言中的,所以你甚至不需要符合C99的編譯器來使用它。

在C++中,標題是不必要的;由C的<iso646.h>定義爲宏的相同令牌是內置的替代拼寫。 (它們在C++標準的相同部分2.6 [lex.digraph]中定義爲二元圖,但腳註明確說術語「二元圖」不適用於詞彙關鍵字,如and。)由於C++標準說:

在語言的所有方面,每個替代令牌分別的行爲 相同,作爲其主要的原因,除了其拼寫。

可能在C++程序中使用#include <ciso646>,但有這樣做(儘管它會影響#ifdef and的行爲)是沒有意義的。

我實際上不會建議在C或C++中使用替代標記,除非您確實需要(例如,在非常罕見的情況下,您在系統中無法輕鬆輸入&字符)。雖然它們對非程序員來說更易讀,但它們很可能是對於具有C和/或C++語言體面知識的人可讀的 - 正如你必須提出這個問題所證明的那樣。

+1

+1這是一種簡潔快速的方式來測試您是否正在使用C++模式進行編譯 –