Тут для себя интересное открытие совершил. Был код:
int size = combo->count();
int index = 0;
qDebug() << "=== INDEX -" << index << "===";
while (index != size){
qDebug() << "INDEX:" << index << "\tVALUE:" << combo->itemText(index++);
}
Ожидал, что будет напечатано:=== INDEX - 0 ===
INDEX: 0 VALUE: "text-1"
INDEX: 1 VALUE: "text-2"
Однако напечатано было:=== INDEX - 0 ===
INDEX: 1 VALUE: "text-1"
INDEX: 2 VALUE: "text-2"
Я полагал, что инкремент будет последней операцией, однако он почему-то стал второй. Т.е. получается выполнение идёт с конца оператора вывода в поток.int size = combo->count();
int index = 0;
qDebug() << "=== INDEX -" << index << "===";
while (index != size){
qDebug() << "INDEX:" << index << "\tVALUE:" << combo->itemText(index);
index++;
}
тогда стало печататься как ожидаемо.Попробуй сам себе ответить на следующие вопросы: что есть выражение "qDebug() << нечто" в смысле языка C++ ? Где точки следования? В каком порядке будут вычисляться подвыражения этого полного выражения? Почему? В какой момент они должны быть вычислены? Почему?
Это один из видов классического UB.
Твой код эквивалентен следующему:
int a = 0;
int b = a + a++;
cout<<b;
пока (что-то){
делаем что-то
}
для i от 5 до 10 с шагом 1{
делаем что-то
}
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)