&& и и оператор в 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).


person haccks    schedule 28.06.2013    source источник


Ответы (8)


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

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

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

EDIT Я только что протестировал его с компилятором C здесь, и он работает.

person chollida    schedule 28.06.2013
comment
@chollida; данная ссылка объяснила все правильно. Спасибо за ссылку. Ваш ответ должен быть принят. - person haccks; 28.06.2013
comment
В C++ заголовок <iso646.h> не используется; ключевые слова — это ключевые слова в C++ без включенного заголовка. - person Jonathan Leffler; 31.08.2013

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

Alternative Primary
    and       &&

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

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

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

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

Изменить

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

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

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

and    &&

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

Обновить

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

person Shafik Yaghmour    schedule 12.08.2013
comment
Другое отличие состоит в том, что когда вы пишете and, большинство читателей запутаются. Особенно, если вы пишете это, например, в int a, b, and c = a; - person Potatoswatter; 12.08.2013
comment
Не соглашусь, что это сбивает с толку большинство читателей. Это только сбивает с толку тех, кто знает C и C++ достаточно, чтобы привыкнуть видеть &&, но не знает об альтернативных токенах (или iso646.h в случае C). Это не сбивает с толку тех, кто знает об альтернативных токенах (редких) или тех, кто только начинает (я бы сказал, что на самом деле это было бы менее запутанно для последней и, вероятно, самой большой по численности группы). ) - person Joe; 12.08.2013
comment
@Joe Может ли кто-нибудь сказать, не зная об альтернативных токенах, что and имеет поведение короткого замыкания, и RHS не будет оцениваться, если LHS равен false? А как насчет других, не операторских применений, как в моем примере выше? - person Potatoswatter; 12.08.2013
comment
@Potatoswatter Первый пункт не является аргументом, поскольку он в равной степени относится к && для людей, не имеющих опыта работы с C ++ (для которых and имеет то преимущество, что фактически указывает, что это значит). Неоператорное использование в ссылках rvalue - это другое дело (хотя ваш пример недействителен), и его, конечно, следует избегать. - person Joe; 12.08.2013
comment
@Joe А как насчет людей, большинство из которых не совсем неопытны? C++ — это не тот язык, которым просто бросаются в невежественных. Мой пример абсолютно верный; это ссылка на rvalue. - person Potatoswatter; 12.08.2013
comment
@Potatoswatter Я не думаю, что на самом деле их составляет большинство. А для тех, кто имеет опыт работы с другими языками, существует множество логических операторов с коротким замыканием с прописанными именами (и, или, нет), например: Python (который многие хвалят за использование их вместо &&, по иронии судьбы не зная, что C++ поддерживает и, или, и не так) - person Joe; 12.08.2013
comment
Я поражен тем, что существуют легко читаемые простые английские альтернативы и что люди по-прежнему предпочитают версии с загадочными знаками препинания. Интересно, сколько ошибок было создано людьми, заменившими & на &&? - person endolith; 04.04.2015

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

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

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

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

В таблице 2:

   Alternative | Primary
        and    |    &&

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


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

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

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

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

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

   and    &&
person Pierre Fourgeaud    schedule 12.08.2013

По сути, and — это просто текстовая версия && в c . Однако вам необходимо #include <iso646.h>. или он не собирается компилироваться.

Подробнее см. здесь:
http://msdn.microsoft.com/en-us/library/c6s3h5a7%28v=vs.80%29.aspx

person Thijser    schedule 28.06.2013
comment
обратите внимание, что предоставленная вами ссылка предназначена для компилятора С++, а не для компилятора C, как указал плакат. - person chollida; 28.06.2013
comment
Я знаю, однако, что это все еще верно. C++ и C часто очень похожи, и это касается одного из этих сходств. - person Thijser; 28.06.2013
comment
@Thijser; Спасибо за ссылку. В вашем ответе не хватает только объяснения макроса, потому что при изменении расширения .c на .cpp оно работает, поскольку оно включает сам макрос. +1. - person haccks; 28.06.2013
comment
В C++ это не макрос, а языковая функция (и #include <ciso646> ничего не делает). - person aschepler; 28.06.2013

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

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

int class;

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

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

#define and &&

Итак, вы можете написать

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

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

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

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

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

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

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

person Keith Thompson    schedule 12.08.2013
comment
+1 Это отличный быстрый способ проверить, компилируете ли вы в режиме С++. - person Shafik Yaghmour; 16.08.2013

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

person Chinna    schedule 28.06.2013
comment
Я не включил iso646.h. - person haccks; 28.06.2013
comment
Для меня это дает ошибку компилятора, если я не включаю файл iso646.h. Он успешно компилируется, если я включаю его. - person Chinna; 28.06.2013
comment
Так и будет! Измените расширение .c на .cpp, тогда оно будет работать без включения iso646.h. - person haccks; 28.06.2013
comment
Да ты прав. Для .cpp он работает без включения iso646.h - person Chinna; 28.06.2013
comment
Да, я тоже проверил... я думаю, что @chollida прав. После изменения расширения макросы включаются автоматически. - person haccks; 28.06.2013

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

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

Итак, resA и resB идентичны.

person P0W    schedule 12.08.2013

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

person faradaj    schedule 12.08.2013
comment
and также может означать ссылку на rvalue. Или вы могли бы иметь operator and. Мы в стране неопределенности. - person Potatoswatter; 12.08.2013
comment
@Potatoswatter Можете ли вы прояснить комментарий rvalue reference? - person Shafik Yaghmour; 12.08.2013
comment
@ShafikYaghmour Это новая функция с C++ 11. Там, где ссылка lvalue в старом стиле объявляется с помощью &, ссылка rvalue объявляется с помощью &&. Это то, что я использовал для синтаксической мерзости в комментарии под вашим ответом. - person Potatoswatter; 12.08.2013
comment
@Potatoswatter О боже, я понимаю, что вы сейчас говорите, мне это просто не приходило в голову, ick! - person Shafik Yaghmour; 12.08.2013