22

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

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

4

8 回答 8

23

&&并且and替代标记并且功能相同,来自 C++ 标准草案的第2.6替代标记

Alternative Primary
    and       &&

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

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

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

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

编辑

我正在添加一个 C 特定答案,因为这最初是对 C++ 问题的答案,但已合并我正在添加C99 草案标准中的相关引用,即第7.9 节替代拼写<iso646.h>第 1 段说:

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

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

and    &&

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

更新

查看您最新的代码更新,我不确定您是否真的在 C 模式下编译,OrwellDev 5.4.2 的发行说明说它使用的是 GCC 4.7.2。我无法将其构建gcc-4.7gcc-4.8用于-x c进入 C 语言模式,请参阅此处的实时代码。尽管如果您评论该gcc行并使用g++它,则可以构建。gcc如果您取消注释,它也可以构建#include <iso646.h>

于 2013-08-12T11:54:58.017 回答
10

在这里查看页面iso646.h

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

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

编辑我刚刚在这里用 C 编译器对其进行了测试,它确实有效。

于 2013-06-28T13:00:05.253 回答
8

and只是&&.

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

2.6 替代标记 [lex.digraph]

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

在表 2 中:

   Alternative | Primary
        and    |    &&

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


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

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

来自 C99 标准草案:

7.9 替代拼写<iso646.h>

标题定义了以下 11 个宏(在左侧),这些宏扩展为相应的标记(在右侧):

   and    &&
于 2013-08-12T11:58:42.173 回答
7

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

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

于 2013-06-28T12:59:57.020 回答
4

如果您的问题中的代码编译时没有错误,那么您不是真的在 C99 模式下编译,或者(不太可能)您的编译器有问题。或者代码不完整,并且有一个#include <iso646.h>您没有向我们展示。

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

int class;

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

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

#define and &&

所以你可以写

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

当您有#include <iso646.h>;时才在 C 中 否则是语法错误。

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

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

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

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

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

于 2013-08-12T17:58:40.910 回答
3

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

运算符是Ref.- OR 运算符or文本等效项||

所以resAresB是相同的。

于 2013-08-12T11:54:55.617 回答
3

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

于 2013-06-28T13:03:39.343 回答
2

&&and是同义词,在 C++ 中表示逻辑与。有关更多信息,请查看C++ 中的逻辑运算符和 C++的运算符同义词

于 2013-08-12T11:59:39.120 回答