Странное целочисленное сравнение в C - PullRequest
0 голосов
/ 09 февраля 2012

Я пишу простую программу на C и не понимаю, почему:

printf("%d\n", 1 == 1 == 1);
printf("%d\n", 1 == 1);
printf("%d\n", 0 == 0 == 0);
printf("%d\n", 0 == 0);

Дает:

1
1
0
1

Я привык к Python, так что все это ново и странно для меня.

(Кстати, кто был изобретателем?)

Ответы [ 3 ]

12 голосов
/ 09 февраля 2012

Я думаю, что C для инопланетян, а не людей.

Может быть.Ни один человек не написал бы код как 1 == 1 == 1.

В любом случае, что здесь происходит.Выражение AFAIK выражается как (1 == 1) == 1, так что это сравнение результата другого сравнения с 1. Значения истины представлены в C как целые числа;true равно 1, false равно 0. Таким образом, 1 == 1 равно 1 (true), и это равно 1.

С 0 == 0 == 0 это похоже:

(0 == 0) == 0
1 == 0 // 0 == 0 is true (1)
0 // 1 == 0 is false (0)
3 голосов
/ 09 февраля 2012

Вам нужно понять,

  1. Приоритет оператора (http://www.swansontec.com/sopc.html).
  2. То, что в C / C ++ 0 эквивалентно false, а любое ненулевое целое число эквивалентно true.
  3. Тип bool неявно приводится к типу целым числом, где 0 приведено к значению false, а 1 - к значению true.

Таким образом, 1 == 1 == 1 оценивается как (1 == 1) == 1 -> true == 1 -> true. Откуда printf("%d\n", 1 == 1 == 1) -> printf("%d\n", true) -> printf("%d\n", (int)true) -> printf("%d\n", 1) -> 1

2 голосов
/ 09 февраля 2012

Результат оператора == равен 1, если два операнда имеют одинаковое значение, и 0, если два значения различны.

...