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.7
和gcc-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
运算符是||
等效文本 参考 – 或运算符
因此resA
和resB
是相同的。
&&
和是同义词,意思是C ++中的逻辑和。 有关更多信息,请参阅C ++中的逻辑运算符和C ++中的 运算符同义词 。