C中的“&&”和“和”运算符

我试图计算两个整数的最大公分母。

C代码:

#include  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语句中,请注意逻辑运算符。 这不是&& (错误地)。 代码工作时没有任何警告或错误。

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

点击这里的页面iso646.h

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

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

编辑我刚刚用C编译器测试它,它确实有效。

&&and备用标记 ,function相同,来自C ++草案标准的 2.6替代标记

 Alternative Primary and && 

表2中的条目之一– 替代标记 ,并在第2小节中说明:

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

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

重要的是要注意,在Visual Studio 中不是C ++中的抱怨 ,显然不打算这样做。

编辑

我正在添加一个C特定答案,因为这最初是对C ++问题的答案,但是合并了我在C99草案标准中添加了相关引用,这是第7.9备选拼写第1段说:

标题定义了以下十一个宏(在左侧),它们扩展为相应的标记(在右侧):

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

 and && 

我们也可以在这里找到一个很好的参考。

更新

看看你最新的代码更新,我不确定你是否真的在C模式下编译,OrwellDev 5.4.2的发行说明说它正在使用GCC 4.7.2。 我不能用gcc-4.7gcc-4.8构建,使用-xc进入C语言模式,请参阅此处的实时代码 。 虽然如果您评论gcc行并使用g++它构建正常。 如果取消注释#include 它也可以在gcc下构建

and只是&&的替代标记。

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

2.6替代令牌[lex.digraph]

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

在表2中:

  Alternative | Primary and | && 

但我建议你使用&& 。 习惯于C / C ++的人可能会对……感到困惑


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

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

从C99标准草案:

7.9替代拼写

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

  and && 

基本上and它只是c中&&的文本版本。 但是你需要#include 。 或者它不会编译。

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

如果您的问题中的代码编译没有错误,要么您没有真正编译C99模式或(不太可能)您的编译器是错误的。 或者代码不完整,并且你没有向我们展示#include

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

 int class; 

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

在C99中,头文件定义了11个宏,这些宏为某些操作符提供了替代拼写。 其中之一是

 #define and && 

所以你可以写

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

只有当你有一个#include 时才在C中; 否则这是一个语法错误。

1995年ISO C标准修订版将添加到该语言中,因此您甚至不需要符合C99标准的编译器来使用它。

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

在语言的所有方面,除了拼写之外,每个备选令牌的行为分别与其主令牌相同。

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

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

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

and运算符是&& Ref- AND运算符的等效文本

or运算符是||等效文本 参考 – 或运算符

因此resAresB是相同的。

&&和是同义词,意思是C ++中的逻辑和。 有关更多信息,请参阅C ++中的逻辑运算符和C ++中的 运算符同义词 。