2013-08-13 2 views
-1

Выход следующей программы: 3 1 3Не удалось понять трехкомпонентную поведение оператора

int main() 
{ 
    int a = 0, b = 1, c = 3; 
    *((a) ? &b : &a) = a ? b : c; // Couldn't understand expression 
    printf("%d %d %d \n", a, b, c); 
    return 0; 
} 

Как троичный оператор работает здесь для этого выхода?

+2

Какой? ....... – WhozCraig

+1

Какая часть неясна? 'a'' '0, поэтому должно быть очевидно, какая опция выбрана в обоих случаях. – JJJ

+4

Сообщите нам, что вы думаете, что результат должен быть вместе с вашими рассуждениями, и мы скажем вам, правильны вы или нет. –

ответ

5
*((a) ? &b : &a) =  a ? b : c ; 
    ^    ^
    = 0     = 0 
    ==false    ==false 

поэтому приведенное выше выражение:

*(&a) = c ; 

что:

 a = c ; 

c = 3; потому, так что это дает:

 a = 3 ; 

b является 1 и c - 3 в вашей декларации (остается без изменений).

+0

: [как работает условный оператор?] (Http://en.wikipedia.org/wiki/Conditional_%28programming%29#If_expressions) –

+0

Итак, если a = 1, тогда результат будет 1,1,3? – Jiminion

+0

@Jim предположим, что если выражение 'a = 1' будет == до' b = b', и да, то o/p будет 1, 1, 3 –

0

My C немного слаб, поэтому, если я здесь не в базе, кто-то мне дал знать.

Предполагая, что вы говорите о выражении *((a) ? &b : &a) (и что вы знаете, как тройной оператор работает вообще), вот как она ломается:

Состояние (a) оценивается: при использовании в булево в int, 0 оценивает значение false, а положительные (или ненулевые?) Значения оцениваются как истинные - в этом случае a == 0 является ложным.

Тернар затем возвращает значение &b, если true и &a, если false (в этом случае оно ложно, поэтому оно возвращает &a).

Возвращаемое значение является ссылкой на переменную; звездочка перед окружающими круглыми скобками разыгрывает эту ссылку, поэтому выражение *((a) ? &b : &a) оценивает переменную - но не значение - a (если a, где не 0, выражение будет оцениваться до b).

Эта строка затем присваивает этой переменной (в данном случае a) значение второго тернарного выражения, которое, как я полагаю, можно вычислить.

Конечным результатом является то, что он присваивает значение c переменной a, что объясняет результат.

0

Обратите внимание, что имеет более высокий precedence чем оператор присваивания.Тройная условно имеет вид:

condition?true-result:false-result

Если condition верно, то результат будет true-result, в противном случае результат равен false-result. Оператор замыкается в том смысле, что оценивается только один из результатов.

Этот оператор может использоваться для условного присвоения. Например:

int days_of_year = is_leap_year ? 366 : 365; 

Результатом тройного условного является значение r. Это означает, что результатом является значение, которое не может быть целью присвоения. Тем не менее, существует трюк, который можно использовать для использования тернарного условного значения с указателями и dereference, чтобы получить поведение условного присвоения одной переменной.

int x; 
int y; 
*(need_x ? &x : &y) = 0; 

В то время как результат тройного состояния является г-значение, результатом разыменования является L-значение. Это означает, что результат разыменования может использоваться как цель назначения.

Ваш код использует обе эти идеи в сочетании.

Смежные вопросы