crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Нюанс оператора вывода в поток
Litkevich Yuriy
  опции профиля:
сообщение 8.4.2010, 15:16
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Тут для себя интересное открытие совершил. Был код:
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++;
}
тогда стало печататься как ожидаемо.

Может кому-то пригодится
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Tonal
  опции профиля:
сообщение 12.4.2010, 10:43
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Это один из видов классического UB.
Твой код эквивалентен следующему:
int a = 0;
int b = a + a++;
cout<<b;

Вывод может быть как 0 так и 2.

Да, код вывода я бы на for переделал. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 9:09