Это: (sequence ? sequence->total : 0)
(это называется «троичный, если», так как он принимает три входа) все равно что сказать:
if (sequence)
replaceEntireExpressionWith(sequence->total);
else
replaceEntireExpressionWith(0);
->
разыменовывается, как и *
, но делает пользовательские типы данных, такие как struct
s, простыми в использовании.
sequence->total
означает, что sequence
- указатель на один из этих типов данных, и вы получаете доступ к свойству total
того, на что оно указывает. Это точно так же, как:
(*sequence).total;
Итак, цикл:
for( i = 0; i < (sequence ? sequence->total : 0); i++ )
выходит, когда sequence
оценивается в false
, поскольку 0 == false
.
Тернар, если конструкция используется, чтобы убедиться, что они не разыменовывают (->
) нулевой указатель, потому что, если они просто ставят sequence->total
как условие, они будут разыменовывать его каждый раз. Несчастная! = (* * Тысяча двадцать-шесть