“&安培;&安培;” C中的“和”运算符

时间:2013-06-28 12:57:19

标签: c operators logical-operators

我正在尝试计算两个整数的最大公分母。

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 模式下)。

8 个答案:

答案 0 :(得分:23)

&&and备用令牌,功能相同,来自C++ draft standard 2.6替代令牌 < / p>

Alternative Primary
    and       &&

表2 - 替代令牌中的一个条目,它在第2小节中说明:

  

在语言的所有方面,除了拼写之外,每个替代标记的行为分别与其主要标记相同。表2中定义了替代令牌集。

正如Potatoswatter指出的那样,使用and很可能会让大多数人感到困惑,所以最好坚持使用&&

重要的是要注意Visual Studio is not complaint in C++并且显然不打算这样做。

修改

我正在添加一个C特定的答案,因为这最初是对C ++问题的回答,但是merged我正在添加C99 draft standard的相关引用,即 7.9替代拼写{ {1}} 第1段说:

  

标题定义了以下扩展的11个宏(在左侧)   到相应的标记(右边):

并包括这一行以及其他几行:

<iso646.h>

我们也可以找到一个很好的参考here

更新

查看您的最新代码更新,我不确定您是否真的在C模式下编译,OrwellDev 5.4.2的release notes表示它正在使用GCC 4.7.2。我无法使用and && gcc-4.7使用gcc-4.8进入C语言模式,请参阅live code here。虽然如果您对-x c行发表评论并使用gcc,那么它构建正常。如果您取消注释g++

,它也会在gcc下构建正常

答案 1 :(得分:10)

点击此处iso646.h

页面

此标头定义了11个宏,它们是某些常见运算符的文本等价物。 and是其中一个定义。

请注意,我只能测试这个C ++编译器,所以我不确定你是否可以使用严格的C编译器。

编辑我刚刚使用C编译器here对其进行了测试,但确实有效。

答案 2 :(得分:8)

and只是&&的备用标记。

我们可以在这里轻松引用标准:

  

2.6替代令牌[lex.digraph]

     

在语言的所有方面,除了拼写之外,每个替代标记的行为分别与其主要标记相同。表2中定义了替代令牌集。

     

在表2中:

   Alternative | Primary
        and    |    &&

但我建议您使用&&。习惯于C / C ++的人可能会被and ...

弄糊涂

由于它现在合并,我们也在谈论C,你可以查看这个页面ciso646来定义替代标记。

  

此标头定义了11个宏常量,其中包含ISO646标准字符集不支持的C ++运算符的替代拼写。

来自C99标准草案:

  

7.9替代拼写<iso646.h>

     

标题定义了以下扩展的11个宏(左侧)   到相应的标记(右边):

   and    &&

答案 3 :(得分:7)

基本上and只是&&的文字版本。 但是你需要#include <iso646.h>。或者它不会编译。

你可以在这里阅读更多:
http://msdn.microsoft.com/en-us/library/c6s3h5a7%28v=vs.80%29.aspx

答案 4 :(得分: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)
如果您有#include <iso646.h>,则仅在

;否则这是一个语法错误。

1995年ISO C标准的修正案将

<iso646.h>添加到该语言中,因此您甚至不需要符合C99标准的编译器来使用它。

在C ++中,标头是不必要的;由C <iso646.h>定义为宏的相同标记是内置的替代拼写。 (它们在C ++标准的同一部分中定义,2.6 [lex.digraph],作为有向图,但脚注澄清了术语“有向图”不适用于像and这样的词汇关键字。)正如C ++标准所说:

  

在语言的各个方面,每个替代令牌都表现出来   同样,分别作为主要令牌,但拼写除外。

可能在C ++程序中使用#include <ciso646>,但这样做没有意义(尽管它会影响#ifdef and的行为。)

我实际上不会建议使用替代标记,无论是在C语言还是在C ++中,除非你真的需要(比如,在非常罕见的情况下,你所在的系统中你无法轻易输入{ {1}}字符)。虽然它们对非程序员来说更具可读性,但对于那些对C和/或C ++语言有相当了解的人来说,它们可能 可读 - 正如你所拥有的那样。问这个问题。

答案 5 :(得分:3)

它正在编译,因为我认为你包括iso646.h(ciso646.h)头文件。 根据它和&amp;&amp ;.相同。如果你不包括它会给编译器错误。

答案 6 :(得分:3)

and运算符相当于&& Ref- AND Operator

的文本

or运算符相当于||参考文献 - OR Operator

因此resAresB完全相同。

答案 7 :(得分:2)

&&and是同义词,在C ++中是指Logical AND。有关详情,请查看Logical Operators in C++Operator Synonyms in C++