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