Подтвердить что ты не робот

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

4b9b3361

Ответ 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 идентичны.