Помогите мне понять параметр завершения этого цикла C ++ for - PullRequest
1 голос
/ 23 апреля 2010

Я не понимаю параметр завершения этого цикла for. Что это значит? В частности, что представляют собой ? , -> и : 0

for( i = 0; i < (sequence ? sequence->total : 0); i++ )

Ответы [ 5 ]

8 голосов
/ 23 апреля 2010

Это: (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 как условие, они будут разыменовывать его каждый раз. Несчастная! = (* * Тысяча двадцать-шесть

2 голосов
/ 23 апреля 2010

Вы видите двух разных операторов.

  1. Условный оператор

    condition ? truePart : falsePart
    

    Этот оператор проверяет, является ли condition истинными оценивается либо truePart или falsePart.

  2. Оператор-член *

    pointer->member
    

    Это эквивалентно (*pointer).member.

Ваше выражение будет иметь значение 0, если sequence равно нулю, и свойство total структуры, на которое указывает sequence, если оно не равно нулю..

2 голосов
/ 23 апреля 2010

, если последовательность недопустима или элемент с именем "total" достигнут i.

? говорит, что если последовательность недопустима, цикл заканчивается, когда я = 0. (поэтому он не будет работать)

1 голос
/ 23 апреля 2010

здесь работают две вещи:

? и: синтаксис - это синтаксис для троичной операции

http://en.wikipedia.org/wiki/Ternary_operation

другие ответы здесь кратко объясняют троичные операторы

Синтаксис -> предназначен для доступа к элементу по указателю, а не по ссылке или значению

этот код эквивалентен:

int total = 0;
if(sequence){
    total = sequence->total;
}

for( i=0; i < total; ++i){
    ...
}
0 голосов
/ 23 апреля 2010

? : - троичный оператор. Он вычисляет выражение перед?, А результатом является выражение после? если true, или выражение после: if false.

-> - это то, что я бы назвал «стрелкой оператора», но по сути он разыменовывает указатель sequence, а затем обращается к члену с именем total.

Две вещи здесь:

  1. Цель этого состоит в том, чтобы убедиться, что sequence не является указателем NULL, прежде чем пытаться разыменовать его с помощью ->,
  2. Цикл должен быть переписан так:
    for( i = 0; sequence && i < sequence->total; i++ )
    Это устраняет путаницу в отношении того, что происходит.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...