Объясните очевидный конфликт между приоритетом && и || и фактический результат выражения [дубликат]

6
задан 13 revs, 7 users 24% 16 August 2014 в 06:40
поделиться

4 ответа

Выражение:

++i || ++j && ++k

Эквивалентно:

(++i) || ((++j) && (++k))

Объяснение:

  1. ++ i вычисляется - (- 2) || ((++ j) && (++ k)) ;
  2. Вычисляется оператор || - (1) ;

Так как ] 1 || something возвращает истину, правый операнд не оценивается. Таким образом, приоритет && здесь не имеет значения. Это короткое замыкание гарантируется как в C, так и в C ++ соответствующими стандартами (см. Требуются ли логические операторы короткого замыкания? И порядок оценки? ).

Теперь попробуйте использовать подвыражение, например:

(++i || ++j) && ++k

Что эквивалентно:

((++i) || (++j)) && (++k)

Объяснение:

  1. ++ i вычисляется - ((- 2) | | (++ j)) && (++ k) ;
  2. || вычисляется - (1) && (++ k)
  3. ++ k оценивается - (1) && (1) ;
  4. Возвращает истину;
2
ответ дан 8 December 2019 в 03:51
поделиться

Результат должен быть примерно таким. :

Error, line 2: 'm': undefined variable.

Редактировать: с этим исправлением нужно оценивать только ++ i . Приоритет не определяет (и даже не влияет) порядок оценки. Приоритет означает, что выражение эквивалентно ++ i || (++ j && ++ k) . Порядок оценки для || или && всегда таков, что вычисляется левый операнд, затем есть точка последовательности. После точки последовательности правый операнд оценивается тогда и только тогда, когда это необходимо для определения окончательного результата (т. Е. Правый операнд || оценивается, если левый операнд равен нулю; правый операнд && оценивается, если левый операнд не равен нулю).

В этом выражении вычисляется ++ i , а затем, поскольку это левый операнд || и оценивается ненулевое значение, остальная часть выражения не оценивается.

22
ответ дан 8 December 2019 в 03:51
поделиться

В качестве пояснения:

#include <stdio.h>

int main()
{
    if (-1)
        printf ("-1!\n");
    else
        printf ("Not -1.\n");
    return 0;
}

Отрицательные числа не являются ложными в C. Всегда сравнивайте булевы значения с 0 (или FALSE), иначе вас может укусить if (worked == TRUE), выдавая ложноотрицательные значения.

0
ответ дан 8 December 2019 в 03:51
поделиться

-2 2 0 1

Ленивый.

#include <stdio.h>

int main()
{

 int i=-3,j=2,k=0;
 int m=++i||++j&&++k;

 printf("%d %d %d %d",i,j,k,m);

}

Скомпилируйте, запустите и убедитесь сами.

gcc tmp.c -o tmp
3
ответ дан 8 December 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: