"&&" и "и" оператор в C

Я пытаюсь вычислить Величайший Общий Знаменатель из двух целых чисел.

Код 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 не && (по ошибке). Код работает без каких-либо предупреждений или ошибок.

Есть and оператор в C? Я использую orwellDev-C++ 5.4.2 (в режиме c99).

8 ответов

Решение

Проверьте страницу здесь iso646.h

Этот заголовок определяет 11 макросов, которые являются текстовыми эквивалентами некоторых общих операторов.and является одним из определений.

Обратите внимание, что я могу проверить это только для компилятора C++, поэтому я не уверен, что вы можете использовать это со строгим компилятором C.

РЕДАКТИРОВАТЬ Я только что протестировал его с компилятором C здесь, и он работает.

&& а также and являются альтернативными токенами и являются функционально одинаковыми из раздела 2.6. Альтернативные токены из проекта стандарта C++:

Alternative Primary
    and       &&

Является ли одна из записей в Таблице 2 - Альтернативные токены и говорит в подразделе 2:

Во всех отношениях языка каждый альтернативный токен ведет себя так же, как и его основной токен, за исключением написания. Набор альтернативных токенов определен в таблице 2.

Как указывает Potatoswatter, используя and скорее всего, запутает большинство людей, поэтому лучше придерживаться &&,

Важно отметить, что в Visual Studio не является жалобой в C++ и, видимо, не планирует быть.

редактировать

Я добавляю специфический для C ответ, поскольку изначально он был ответом на вопрос C++, но был объединен. Я добавляю соответствующую цитату из чернового стандарта C99, раздел 7.9 Альтернативное написание <iso646.h> пункт 1 говорит:

Заголовок определяет следующие одиннадцать макросов (слева), которые расширяются до соответствующих токенов (справа):

и включает в себя эту строку, а также несколько других:

and    &&

Мы также можем найти хорошую ссылку здесь.

Обновить

Глядя на ваше последнее обновление кода, я не уверен, что вы действительно компилируете в режиме C, заметки о выпуске для OrwellDev 5.4.2 говорят, что он использует GCC 4.7.2. Я не могу заставить это встроить либо gcc-4.7 ни gcc-4.8 с помощью -x c чтобы перевести в режим языка C, посмотрите живой код здесь. Хотя, если вы прокомментируете gcc линия и использование g++ это строит хорошо. Он также строит нормально под gcc если вы раскомментируете #include <iso646.h>

and это просто альтернативный токен для &&,

Мы можем легко процитировать стандарт здесь:

2.6 Альтернативные токены [lex.digraph]

Во всех отношениях языка каждый альтернативный токен ведет себя так же, как и его основной токен, за исключением написания. Набор альтернативных токенов определен в таблице 2.

В таблице 2:

   Alternative | Primary
        and    |    &&

Но я предлагаю вам использовать &&, Люди, привыкшие к C/C++, могут запутаться and...


Поскольку это объединено сейчас, мы говорим также о C, вы можете проверить эту страницу ciso646, определяющую альтернативные токены.

Этот заголовок определяет 11 макро констант с альтернативным написанием для тех операторов C++, которые не поддерживаются стандартным набором символов ISO646.

Из проекта стандарта C99:

7.9 Альтернативные варианты написания<iso646.h>

Заголовок определяет следующие одиннадцать макросов (слева), которые расширяются до соответствующих токенов (справа):

   and    &&

В принципе and это просто текстовая версия && в с. Вам, однако, нужно #include <iso646.h>, или это не собирается компилировать.

Вы можете прочитать больше здесь:
http://msdn.microsoft.com/en-us/library/c6s3h5a7%28v=vs.80%29.aspx

Если код в вашем вопросе компилируется без ошибок, либо вы на самом деле не компилируете в режиме C99, либо (менее вероятно) ваш компилятор содержит ошибки. Или код неполный, и есть #include <iso646.h> что ты не показал нам.

Скорее всего, вы на самом деле вызываете свой компилятор в режиме C++. Чтобы проверить это, попробуйте добавить объявление вроде:

int class;

Компилятор переменного тока примет это; компилятор C++ отклонит его как синтаксическую ошибку, так как class это ключевое слово. (Это может быть немного более надежным, чем тестирование __cplusplus макро; неправильно сконфигурированная система разработки могла бы вызвать компилятор C++ с препроцессором в режиме C.)

В С99 шапка <iso646.h> определяет 11 макросов, которые предоставляют альтернативные варианты написания для определенных операторов. Одним из них является

#define and &&

Так что вы можете написать

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

в С, только если у вас есть #include <iso646.h>; в противном случае это синтаксическая ошибка.

<iso646.h> был добавлен к языку в 1995 году поправкой к стандарту ISO C 1990 года, так что вам даже не нужен C99-совместимый компилятор для его использования.

В C++ заголовок не нужен; те же самые токены, определенные как макросы C <iso646.h> встроенные альтернативные варианты написания. (Они определены в том же разделе стандарта C++, 2.6 [lex.digraph], что и орграфы, но в сноске поясняется, что термин "орграф" не применяется к лексическим ключевым словам, таким как and.) Как говорит стандарт C++:

Во всех отношениях языка каждый альтернативный токен ведет себя так же, как и его основной токен, за исключением написания.

Вы могли бы использовать #include <ciso646> в программе на C++, но в этом нет никакого смысла (хотя это повлияет на поведение #ifdef and).

На самом деле я бы не советовал использовать альтернативные токены, как в C, так и в C++, если только вам это не нужно (скажем, в очень редком случае, когда вы находитесь в системе, где вы не можете легко войти в & персонаж). Несмотря на то, что они более читабельны для непрограммистов, они, вероятно, будут менее читабельными для тех, кто хорошо знаком с языком C и / или C++ - как показывает тот факт, что вам пришлось задавать этот вопрос.

Он компилируется для вас, потому что я думаю, что вы включили заголовочный файл iso646.h(ciso646.h). По этому и идентично &&. Если вы не включите это, это выдаст ошибку компилятора.

and оператор является текстовым эквивалентом && Ref- И Оператор

or оператор является текстовым эквивалентом || Ref.- ИЛИ Оператор

Так resA а также resB идентичны

&& а также and являются синонимами и означают логическое И в C++. Для получения дополнительной информации проверьте Логические операторы в C++ и Синонимы операторов в C++.

Другие вопросы по тегам