Необычное поведение троичного оператора? - PullRequest
1 голос
/ 20 января 2012

Сегодня я просто играл с троичным оператором в моем классе.И нашел это странное поведение.

#include <stdio.h>
#include <stdbool.h>
main()
{
        int x='0' ? 1 : 2;
        printf("%i",x);
}

returns 1, как и ожидалось. Но

#include <stdio.h>
#include <stdbool.h>
main()
{
        int x='0'==true ? 1 : 2;
        printf("%i",x);
}

returns 2 пока я ожидаю, что return 1.

Ответы [ 6 ]

2 голосов
/ 20 января 2012

Значение '0' не равно нулю, это любое целочисленное значение, кодирующее цифру '0' в вашей системе.Обычно 48 (в кодировках, заимствованных из ASCII ), что тогда не равно true при интерпретации как целое число, равное 1.

Итак, первая из ваших строк кода эквивалентнадо

int x = (48 != 0) ? 1 : 2;

, что явно равно 1.Вторым является

int x = (48 == 1) ? 1 : 2;

, который столь же ясно оценивается как 2.

1 голос
/ 20 января 2012

Может быть, вы путаете '\0' и '0'

Значение символьной константы

'\0'

всегда 0 в C.

Значение символьной константы

'0'

определяется реализацией и зависит от набора символов.Для ASCII это 0x30.

Также обратите внимание, что макрос true определяется значением 1, а не 0.

1 голос
/ 20 января 2012

Это потому, что (при условии ASCII) '0' представляет целое число 0x30, то есть 48, а true представляет целое число 1.Так что они не равны.

В C любое ненулевое значение считается истинным, но true само по себе равно 1, а 1 - это то, что вы получаете из любого встроенного булева теста (дляНапример, 0 == 0 - это 1).

0 голосов
/ 20 января 2012

'0' не равно true, поэтому результат '0'==true равен 0 (ложь). Это присваивается x и передается троичному оператору, давая результат, который вы видите.

Если вы предполагали что-то другое, вы должны использовать скобки, чтобы уточнить порядок старшинства, который вам нужен, или разбить ваш код на несколько операторов.

0 голосов
/ 20 января 2012

Это потому что '0' != true. Логическое значение повышается до целочисленного типа и равно 1, тогда как '0' равно 48

0 голосов
/ 20 января 2012

true определяется как 1. '0' в ASCII равно 0x30, что не равно 1.

Следовательно, условие '0'==true неверно.

...