2015-06-18 2 views
-1

Изучая C, я столкнулся с чем-то, что совершенно сбивает меня с ума.C тройной оператор

Выражение:

exp(V*log(i))?i%2?s:s--:s++; 

Если троичный оператор Вопрос Положительный: Отрицательный;? Я думал, что это было что-то вроде:

if(pow(i,V)==1&&(i%2)==0) 
    s--; 
else 
    s++; 

Однако, то s не входит в этот вопрос, я должен спросить, что делает первое выражение означает?

Программа отлично работала, но я не мог понять, почему.

Оригинальная программа:

main(){ 
    #define V 1 

    int a, s=0, i; 
    for(i=1000;i>=0;i--) 
     exp(V*log(i))?i%2?s:s--:s++; 
    exp(V*log(i))?printf("%d\t%d\t",-s,i):printf("%d\t%d\t", s,-i); 
    getch(); 
} 
+0

Несколько лишних скобок бы сделать это гораздо яснее. –

+0

Подробнее о [приоритете оператора] (https://en.wikipedia.org/wiki/Operators_in_C_and_C++) или [здесь] (http://en.cppreference.com/w/c/language/operator_precedence) – Olaf

ответ

1

Если ехр (У журнала (я)) истинно, то тест является странным, я% 2 == 1, если это возвращение s, если даже вернуть S-- если ехр (V журнал (я)) ложна возвращение s ++ Если написать это, чем легче увидеть:

exp(V*log(i))?(i%2?s:s--):s++; 
+0

Humm .. Thank вы очень. Это имеет смысл. –

+0

Добро пожаловать. Естественно, я поменялся странно и даже объяснительно. Сейчас это исправит. –

1

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

exp(V*log(i))?i%2?s:s--:s++; 

Это приводит к

if(exp(V*log(i)) 
    if(i%2) 
     s; 
    else 
     s--; 
else 
    s++; 

Единственное отличие состоит в том, что это выражение и один оператор вместо версия if/else. Он всегда возвращает текущее значение s, но изменяет его в зависимости от состояния.

Если exp относится к экспоненциальной функции, то если выход -inf выход будет !=0 поэтому значение будет оценивать с true. Обратите внимание: nan также будет оценивать значение false, а nan - это результат для log, когда значение находится за пределами его домена.

Так в основном вы могли бы перевести это с гораздо более простым выражением (если V не равен нулю, то значение i==0 изменится):

i>0?s++:i%2?s:s--; 
Смежные вопросы