Несколько частей взаимодействия троичных операторов - PullRequest
0 голосов
/ 05 июня 2018

Это печатает 4.Почему?

Я знаю, как работают троичные операторы, но это усложняет.

printf("%d", 0 ? 1 ? 2 : 3 : 4 );

Также это печатает d.???

int x=0, y=1 ;
printf( "d", x ? y ? x : y : x ) ;

Ответы [ 7 ]

0 голосов
/ 05 июня 2018

Тернарные операторы, как если бы еще.Если вы добавите круглые скобки в ваш код, все станет проще:

0 ? (1 ? 2 : 3) : 4

Помните, что в C ноль означает false, все ненулевые означает true.Таким образом, вышеприведенное утверждение не проходит тест и возвращает третью часть, то есть 4.

0 голосов
/ 05 июня 2018
printf("%d", 0 ? 1 ? 2 : 3 : 4 );

Здесь спецификатор формата "% d", поэтому он печатает правильное значение, равное 4., но в

int x=0, y=1 ;
printf( "d", x ? y ? x : y : x ) ;

здесь не указан ни один спецификатор формата, поэтому он просто печатает "d" иигнорировал другой параметр.

0 голосов
/ 05 июня 2018

У вас есть несколько троичных операторов в выражении printf("%d", 0 ? 1 ? 2 : 3 : 4 );

И когда когда-либо один и тот же оператор приходит несколько раз, мы использовали для проверки associativity, который составляет от Right до Left для троичного оператора, т.е. сначаларешает right most ternary opeartor.Или вы можете увидеть это в man 1 operator

Первый выбор наиболее правого троичного оператора 1 ? 2 : 3, что приводит к 2.Теперь 3 ушел.

Теперь он становится 0 ? 2 : 4, что приводит к 4.Вот почему он печатает 4.

Примечание: - Как уже говорили другие, с помощью правильного ассоциативного троичного оператора вы можете сложить их и построить выражение if-else, например:

if(0){ if(1) printf("%d\n", 2); else printf("%d\n", 3); } else printf("%d\n", 4);

0 голосов
/ 05 июня 2018

Это действительно должно вывести 4. Тернарный оператор работает следующим образом:

(condition) ? expression1 : expression2

Если условие оценивается как true, возвращается expression1, а в противном случае expression2 возвращается.В вашем случае структура выглядит следующим образом:

0?(1?2:3):4 т.е. Здесь 1?2:3 - это выражение1, 4 - это выражение2 и вместо условия мы имеем 0.Как вы, возможно, знаете, 0 в условии оценивается как ложное, а любое ненулевое значение оценивается как истинное.Так что здесь, поскольку условие ложно (то есть 0), выражение2 (4) возвращается.

0 голосов
/ 05 июня 2018
0 ? 1 ? 2 : 3 : 4

проанализирован как

(0 ? (1 ? 2 : 3) : 4)

Итак, вы получили вывод как 4.

0 голосов
/ 05 июня 2018

Разбейте его с помощью if..else заявления

if(0){
    if(1)
        printf("%d\n", 2); 
    else
        printf("%d\n", 3);
} 
else
    printf("%d\n", 4);
0 голосов
/ 05 июня 2018

Во-первых, это «вложенный» терренарный оператор.Я бы поставил вокруг него скобки, чтобы сделать его более декодируемым.Рассмотрим 0 ? 1 ? 2 : 3 : 4, позволяет преобразовать это в 0 ? (1 ? 2 : 3) : (4), это 0?выполняется другая часть, которая равна 4

Для второй вы пропускаете %d

...