【问题标题】:"&&" and "and" operator in CC中的“&&”和“and”运算符
【发布时间】:2013-06-26 06:14:50
【问题描述】:

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

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 而不是&amp;&amp;(错误地)。该代码在没有任何警告或错误的情况下工作。

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

【问题讨论】:

    标签: c operators logical-operators


    【解决方案1】:

    &amp;&amp;and替代令牌,并且在功能上相同,来自 C++ draft standard2.6 替代令牌部分:

    Alternative Primary
        and       &&
    

    表 2 - 替代标记 中的条目之一,它在第 2 小节中说:

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

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

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

    编辑

    我正在添加一个 C 特定的答案,因为这最初是一个 C++ 问题的答案,但它是 merged 我正在添加来自 C99 draft standard 的相关引用,这是 7.9 替代拼写 &lt;iso646.h&gt; 部分em> 第 1 段说:

    标题定义了以下 11 个宏(在左侧),它们展开 到相应的标记(右侧):

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

    and    &&
    

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

    更新

    查看您最新的代码更新,我不确定您是否真的在 C 模式下编译,OrwellDev 5.4.2 的release notes 说它使用的是 GCC 4.7.2。我无法在gcc-4.7gcc-4.8 中使用-x c 进入C 语言模式,请参阅live code here。虽然如果您评论 gcc 行并使用 g++ 它构建正常。如果您取消注释#include &lt;iso646.h&gt;,它在gcc 下也可以正常构建

    【讨论】:

    • 嗯,另一个区别是当你写and时,大多数读者会感到困惑。特别是如果你写它,例如int a, b, and c = a;
    • 我不同意这会让“大多数读者”感到困惑。对于那些了解 C 和 C++ 以习惯于看到 &amp;&amp; 但不了解替代标记(或 C 中的 iso646.h)的人来说,这只会让人感到困惑。对于那些知道替代令牌(稀有)或刚开始的人来说,这并不令人困惑(我认为它实际上对于后者来说较少令人困惑,并且可能是数量最多的,组)
    • @Joe 在不知道替代令牌的情况下,有人可以告诉and 具有短路行为,并且如果 LHS 是 false,则不会评估 RHS?那么我上面的例子中的其他非运营商用途呢?
    • @Potatoswatter 第一点是非论点,因为它同样适用于&amp;&amp;,适用于没有 C++ 经验的人(and 具有实际说明其含义的优势) .右值引用中的非运算符使用是另一回事(尽管您的示例无效),当然应该避免。
    • @Potatoswatter 我不认为这些实际上是 多数。对于那些有其他语言经验的人来说,有很多用拼写名称(and,or,not)的短路逻辑运算符,例如:Python(很多人称赞使用那些而不是 &&,讽刺的是不知道 C++ 支持and, or, and not as well)
    【解决方案2】:

    在此处查看页面iso646.h

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

    请注意,我只能为 C++ 编译器测试它,所以我不确定您是否可以将它与严格的 C 编译器一起使用。

    编辑我刚刚用 C 编译器 here 对其进行了测试,它确实可以工作。

    【讨论】:

    • @chollida;给定的链接以正确的方式解释了事情。感谢您的链接。你的回答应该被接受。
    • 在 C++ 中,&lt;iso646.h&gt; 标头是空操作;关键字是 C++ 中的关键字,不包含任何标题。
    【解决方案3】:

    and 只是&amp;&amp; 的替代标记。

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

    2.6 替代标记 [lex.digraph]

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

    在表 2 中:

       Alternative | Primary
            and    |    &&
    

    但我建议你使用&amp;&amp;。习惯 C/C++ 的人可能会被 and 搞糊涂……


    既然它现在被合并了,我们也在谈论 C,你可以查看这个页面 ciso646 定义替代令牌。

    此标头为 ISO646 标准字符集不支持的 C++ 运算符定义了 11 个具有替代拼写的宏常量。

    来自 C99 草案标准:

    7.9 替代拼写 &lt;iso646.h&gt;

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

       and    &&
    

    【讨论】:

    • 你的意思是“标准”的ANSI吗?
    • @paykoob 我的意思是C++ standard draft
    • 它也在 ISO/IEC 14882:1998 / 2011 标准中
    • @paykoob C++ 由 ISO 标准化,其中 ANSI 是橡皮图章成员。皮埃尔,N3690 已经出来了。
    • @Potatoswatter 谢谢,我不知道。我现在就用这个​​ :) C++ draft standard n3690 如果有人想要的话。
    【解决方案4】:

    基本上and 只是&amp;&amp; 的文本版本。 但是,您确实需要#include &lt;iso646.h&gt;。否则它不会编译。

    您可以在此处阅读更多信息:
    http://msdn.microsoft.com/en-us/library/c6s3h5a7%28v=vs.80%29.aspx

    【讨论】:

    • 请注意,您提供的链接适用于 C++ 编译器,而不是海报所示的 C 编译器。
    • 我知道它仍然适用。C++ 和 C 通常非常相似,这涉及其中一个相似之处。
    • @Thijser;感谢您的链接。您的答案仅在解释宏方面缺乏,因为在将扩展名 .c 更改为 .cpp 时,它可以工作,因为它包含宏本身。 +1。
    • 在 C++ 中,它并不是真正的宏,而是一种语言特性(#include &lt;ciso646&gt; 什么都不做。)
    【解决方案5】:

    如果您的问题中的代码编译时没有错误,那么您不是真的在 C99 模式下编译,或者(不太可能)您的编译器有错误。或者代码不完整,还有一个#include &lt;iso646.h&gt;你没有给我们看。

    您很可能实际上是在 C++ 模式下调用编译器。要对此进行测试,请尝试添加如下声明:

    int class;
    

    C 编译器会接受这个; C++ 编译器会将其作为语法错误拒绝,因为 class 是关键字。 (这可能比测试__cplusplus 宏更可靠;可以想象,错误配置的开发系统可能会在 C 模式下调用带有预处理器的 C++ 编译器。)

    在 C99 中,标题 &lt;iso646.h&gt; 定义了 11 个宏,为某些运算符提供替代拼写。其中之一是

    #define and &&
    

    所以你可以写

    if(temp1 ==0 and temp2 == 0)
    

    仅在 C 中 如果您有 #include &lt;iso646.h&gt;;否则是语法错误。

    &lt;iso646.h&gt; 是由 1990 年 ISO C 标准的 1995 年修正案添加到该语言中的,因此您甚至不需要符合 C99 的编译器即可使用它。

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

    在语言的所有方面,每个替代标记都表现出 除了拼写之外,分别与它的主要标记相同。

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

    我实际上不建议在 C 或 C++ 中使用替代标记,除非您确实需要(例如,在极少数情况下,您所在的系统无法轻松输入 @ 987654334@ 字符)。尽管它们对非程序员来说更具可读性,但对于对 C 和/或 C++ 语言有一定了解的人来说,它们可能不太可读——正如你所拥有的事实所证明的那样问这个问题。

    【讨论】:

    • +1 如果您在 C++ 模式下编译,这是一种简洁的快速测试方法
    【解决方案6】:

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

    【讨论】:

    • 我没有包含iso646.h
    • 对我来说,如果我不包含 iso646.h 文件,则会出现编译器错误。如果我包含它,它将成功编译。
    • 会的!将扩展名.c 更改为.cpp 然后它可能会在不包括iso646.h 的情况下工作。
    • 是的,你是对的。对于 .cpp,它不包括 iso646.h
    • 是的,我也检查过...我认为@chollida 是正确的。更改扩展后,宏是自包含的。
    【解决方案7】:

    and 运算符是 &amp;&amp; Ref- AND Operator 的文本等价物

    or 运算符是 || Ref.- OR Operator 的文本等价物

    所以resAresB 是相同的。

    【讨论】:

      【解决方案8】:

      &amp;&amp;and 是同义词,在 C++ 中表示逻辑与。更多信息请查看Logical Operators in C++Operator Synonyms in C++

      【讨论】:

      • and 也可以表示右值引用。或者你可以有operator and。我们处于模棱两可的土地上。
      • @Potatoswatter 你能澄清rvalue reference的评论吗?
      • @ShafikYaghmour 这是自 C++11 以来的新功能。旧式“左值”引用用&amp; 声明,右值引用用&amp;&amp; 声明。这就是我在您的答案下的评论中使用的语法厌恶。
      • @Potatoswatter 哦,天哪,我明白你现在在说什么,我只是没想到,哎呀!
      猜你喜欢
      • 2021-11-08
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2020-10-24
      • 1970-01-01
      相关资源
      最近更新 更多