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;
заявленияПонимание условный оператор
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;
заявленияПонимание условный оператор
разбить его на части:
*((a)?&b:&c) = a?b:c;
Мы присваивание значения. Что такое a?b:c
? Поскольку a
истинно, a?b:c
оценивает до b
, то есть 11
.
Теперь давайте посмотрим на то, что мы присваивание:
(a)?&b:&c
Поскольку a
верно, это выбирает &b
, адрес b
. Итак, у нас есть
*&b = b;
Таким образом, мы просто назначаем b
себе.
Позволяет понять этого монстра:
*((a)?&b:&c)=a?b:c;
Возьмите первый оцененную часть: (a)?&b:&c
: просто означает, что если a
не равен нулю, то получите адрес b
, в противном случае получить адрес c
.
Вторая часть оценивается:
*(...)
разыменовывает обращение к фактическому значению. В этом случае это оценивается как *&b
, который равен b
(*
- это инверсия &
).
Правая сторона a?b:c
оценивает по методу b
(также как с левой стороны).
т.е. вы просто записывала b = b
;)
*((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;
Thanx для всех ответов u для ur –
Есть ли у вас представление о троичной '?: 'операция вообще? 'x? y: z' означает *, если 'x' истинно, тогда' y', иначе 'z' *. Также обратите внимание, что ненулевое целое число в C является «правдивым» (оценивается как «true»). – lurker
«Если' a' отличен от нуля, разыщите адрес 'b' (или' c', если 'a' _not_ ненулевой) и установите его равным ... если' a' отличен от нуля, 'b', в противном случае' c' " –
FYI-Этот код не будет компилироваться. – ameyCU