Как мы можем использовать троичный оператор со стольким множеством других, если мы хотим? - PullRequest
0 голосов
/ 25 января 2020

Базовое c использование троичного оператора составляет

(condition) ? True part : False part

Как мы можем добавить к этому функциональность «несколько других-если»?

Ответы [ 4 ]

3 голосов
/ 25 января 2020

При объединении троичного оператора форматирование является ключом к тому, чтобы сделать его читаемым:

Попытка сделать все это в одной длинной строке делает его неразборчивым.

int result = (oper=='+')?  a+b : 
             (oper=='-')?  a-b : 
             (oper=='/')?  a/b : 
             (oper=='*')?  a*b : 
             (oper=='^')?  a^b : 
             (oper=='&')?  a&b : 
             0;

Или отформатировать Zafeer пример:

#include <stdio.h>
int main(){
     for(int i = 1; i<=10; i++)
          printf("%d%s\n",i, (i==1)? "st":
                             (i==2)? "nd":
                             (i==3)? "rd": 
                                     "th");
}
2 голосов
/ 25 января 2020

Грамматика довольно ясно говорит, как вы можете это сделать. Грамматика:

conditional_expression
    : logical_or_expression
    | logical_or_expression '?' expression ':' conditional_expression
    ;

https://www.lysator.liu.se/c/ANSI-C-grammar-y.html

Это говорит о том, что все, что следует после :, должно быть действительным условное выражение .

Но это редко бывает полезно. В соответствии с ответом, который вы дали, вы хотите использовать его для форматирования распечаток. Но было бы гораздо лучше извлечь его из отдельной функции, например:

const char* suffix(int n)
{
    static const char suffix[][3] = { "st", "nd", "rd", "th" };
    int rIndex;
    /* Some logic */
    return suffix[rIndex];
}

А затем

printf("%d%s\n", i, suffix(i));
2 голосов
/ 25 января 2020
(condition 1)? True statements for cond. 1 :(condition 2)?  True statements for cond. 2: else statements

Мы можем использовать условный оператор для добавления else, если условие в одной строке.

Пример

#include <stdio.h>
int main(){
     for(int i = 1; i<=10; i++)
          printf("%d%s\n",i,(i==1)?"st":(i==2)?"nd":(i==3)?"rd":"th");
}

Результат

1st
2nd
3rd
4th
5th
6th
7th
8th
9th
10th
1 голос
/ 25 января 2020

Что касается управления потоком, троичный функционирует так же, как if-else, и гнездится как if-else

SIMPLE

if (cond ) yes ; else no;
~
(cond) ? yes : else no

LADDER

if (cond ) yes ;
else if (cond2) cond2yes;
else  if (cond3) cond3yes;
else cond3no;
~
cond  ? yes :
cond2 ? cond2yes :
cond3 ? cond3yes :
cond3no

Недавно мне понадобилась куча сложных вложенных тернариев, и я обнаружил, что структурирование их так легко читается, особенно с помощью редактора, соответствующего скобкам:

cond ? (
    yes
) : ( cond2 ? (
        cond2yes
    ) : ( cond3 ? (
            cond3yes
        ) : (
            cond3no
        )
    )
)
...