2015-08-17 2 views
-2
int main() 
{ 
    int a=10,b=11,c=13; 
    *((a)?&b:&c)=a?b:c; 
    printf("%d %d %d ,"a,b,c); 
    return 0; 
} 

Я не понимаю, выход *((a)?&b:&c)=a?b:c; заявленияПонимание условный оператор

+1

Есть ли у вас представление о троичной '?: 'операция вообще? 'x? y: z' означает *, если 'x' истинно, тогда' y', иначе 'z' *. Также обратите внимание, что ненулевое целое число в C является «правдивым» (оценивается как «true»). – lurker

+0

«Если' a' отличен от нуля, разыщите адрес 'b' (или' c', если 'a' _not_ ненулевой) и установите его равным ... если' a' отличен от нуля, 'b', в противном случае' c' " –

+2

FYI-Этот код не будет компилироваться. – ameyCU

ответ

1

разбить его на части:

*((a)?&b:&c) = a?b:c; 

Мы присваивание значения. Что такое a?b:c? Поскольку a истинно, a?b:c оценивает до b, то есть 11.

Теперь давайте посмотрим на то, что мы присваивание:

(a)?&b:&c 

Поскольку a верно, это выбирает &b, адрес b. Итак, у нас есть

*&b = b; 

Таким образом, мы просто назначаем b себе.

2

Позволяет понять этого монстра:

*((a)?&b:&c)=a?b:c;

Возьмите первый оцененную часть: (a)?&b:&c: просто означает, что если a не равен нулю, то получите адрес b, в противном случае получить адрес c.

Вторая часть оценивается:

*(...) разыменовывает обращение к фактическому значению. В этом случае это оценивается как *&b, который равен b (* - это инверсия &).

Правая сторона a?b:c оценивает по методу b (также как с левой стороны).

т.е. вы просто записывала b = b;)

2
*((a)?&b:&c)=a?b:c; 

В первом *((a)?&b:&c)

если a в ненулевым, то address of b еще address of c. Как здесь a есть 10 поэтому результат будет address of b.

Затем оно разыменовывается, что означает значение по этому адресу означает значение b i.e 11.

Тогда это a?b:c .test - если a является non-zero то b еще c. Поскольку a есть non-zero поэтому результат b.

И наконец, что мы получаем

b=b; 
+1

Thanx для всех ответов u для ur –

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