我正在尝试计算两个整数的最大公分母。
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 模式下)。
答案 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
只是c中&&
的文字版本。
但是你需要#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)
答案 7 :(得分:2)
&&
和and
是同义词,在C ++中是指Logical AND。有关详情,请查看Logical Operators in C++和Operator Synonyms in C++。