Оператор "&&" и "и" в 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-С++ 5.4.2 (в режиме c99).
Ответы
Ответ 1
Посмотрите страницу здесь iso646.h
Этот заголовок определяет 11 макросов, которые являются текстовыми эквивалентами некоторых общих операторов.
and
является одним из определений.
Обратите внимание, что я могу проверить это только для компилятора С++, поэтому я не уверен, что вы можете использовать его со строгим компилятором C.
EDIT Я только что протестировал его с компилятором C здесь, и он работает.
Ответ 2
&&
и and
являются альтернативными токенами и являются функционально такими же, из раздела 2.6. Альтернативные токены из проект стандарта С++:
Alternative Primary
and &&
Является одной из записей в таблице 2 - Альтернативные жетоны, и она гласит в подразделе 2:
Во всех аспектах языка каждый альтернативный токен ведет себя одинаково, соответственно, как основной маркер, за исключением его орфографии. Набор альтернативных токенов определен в таблице 2.
Как указывает Potatoswatter, использование and
, скорее всего, путает большинство людей, поэтому, вероятно, лучше придерживаться &&
.
Важно отметить, что в Visual Studio
не является жалобой на С++ и, по-видимому, не планирует быть.
Изменить
Я добавляю C-специфический ответ, потому что это был исходный ответ на вопрос С++, но был объединен. Я добавляю соответствующую цитату из C99 draft standard, который является разделом 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++
, она строит нормально. Он также строит ok под gcc
, если вы раскомментируете #include <iso646.h>
Ответ 3
and
- это просто альтернативный токен для &&
.
Мы можем легко привести здесь стандарт:
2.6 Альтернативные маркеры [lex.digraph]
Во всех аспектах языка каждый альтернативный токен ведет себя одинаково, соответственно, как основной маркер, за исключением его орфографии. Набор альтернативных токенов определен в таблице 2.
В таблице 2:
Alternative | Primary
and | &&
Но я предлагаю вам использовать &&
. Люди, использующие C/С++, могут запутаться в and
...
Так как теперь он слит, мы говорим также о C, вы можете проверить эту страницу ciso646, определяя токены альтернатив.
Этот заголовок определяет 11 макроконстантов с альтернативными написаниями для тех операторов С++, которые не поддерживаются стандартным набором символов ISO646.
Из стандарта проекта C99:
7.9 Альтернативные варианты написания <iso646.h>
Заголовок определяет следующие одиннадцать макросов (слева), которые расширяются к соответствующим токенам (справа):
and &&
Ответ 4
В основном and
- это только текстовая версия &&
в c.
Однако вам нужно #include <iso646.h>
. или он не собирается компилироваться.
Вы можете прочитать больше здесь:
http://msdn.microsoft.com/en-us/library/c6s3h5a7%28v=vs.80%29.aspx
Ответ 5
Если код вашего вопроса компилируется без ошибок, либо вы не компилируете в режиме C99, либо (менее вероятно) ваш компилятор не работает. Или код неполный, и там #include <iso646.h>
, который вы нам не показали.
Скорее всего, вы действительно вызываете свой компилятор в режиме С++. Чтобы проверить это, попробуйте добавить объявление, например:
int class;
Компилятор C примет это; компилятор С++ отклонит его как синтаксическую ошибку, так как class
- это ключевое слово. (Это может быть немного более надежным, чем тестирование макроса __cplusplus
, неправильно сконфигурированная система разработки, возможно, может вызвать компилятор С++ с препроцессором в режиме C.)
В C99 заголовок <iso646.h>
определяет 11 макросов, которые предоставляют альтернативные варианты написания для некоторых операторов. Один из них -
#define and &&
Итак, вы можете написать
if(temp1 ==0 and temp2 == 0)
в C, только если у вас есть #include <iso646.h>
; в противном случае это синтаксическая ошибка.
<iso646.h>
был добавлен к языку с поправкой 1995 года к стандарту ISO ISO 1990, поэтому вам даже не нужен компилятор, совместимый с C99, чтобы использовать его.
В С++ заголовок не нужен; те же самые жетоны, определенные как макросы с помощью C <iso646.h>
, являются встроенными альтернативными написаниями. (Они определены в том же разделе стандарта С++, 2.6 [lex.digraph], в качестве орграфов, но сноска поясняет, что термин "орграф" не применяется к лексическим ключевым словам, например, and
.) Поскольку В стандарте С++ говорится:
Во всех аспектах языка каждый альтернативный токен ведет себя то же самое, в качестве основного токена, за исключением его написания.
Вы можете использовать #include <ciso646>
в программе на С++, но при этом нечего делать (хотя это повлияет на поведение #ifdef and
).
На самом деле я бы не советовал использовать альтернативные токены, как на C, так и на С++, если вам действительно не нужно (скажем, в очень редком случае, когда вы находитесь в системе, где вы не можете легко ввести &
). Хотя они более читабельны для не-программистов, они, вероятно, будут менее читабельны для кого-то с приличным знанием языка C и/или С++, о чем свидетельствует тот факт, что вы должны были задать этот вопрос.
Ответ 6
Он компилируется для вас, потому что я думаю, что вы включили заголовочный файл iso646.h(ciso646.h).
В соответствии с этим и идентична & &. Если вы не указали, что он дает ошибку компилятора.
Ответ 7
Оператор and
представляет собой текстовый эквивалент &&
Ref- И оператор
Оператор or
является текстовым эквивалентом ||
Ref.- OR Operator
Итак, resA
и resB
идентичны.
Ответ 8
&&
и and
являются синонимами и означают логическое И в С++. Для получения дополнительной информации проверьте Логические операторы в С++ и Синонимы операторов в С++.