2014-08-29 3 views
-2

Посмотрите этот кусок кода:GCC генерируется с ума программу

vector<Command*> list; 
int cur = -1; 

if(cur < (list.size()-1)) 
{ 
    cout<<"redo"<<endl; 
    ++cur; 
    list[cur]->execute(text); 
    cout<<"pos: "<<cur<<" size: "<<list.size()<<endl; 
} 
else 
{ 
    cout<<cur<<" "<<(list.size()-1)<<" "<<(cur > (list.size()-1))<<endl; 
} 
if(-1>2) 
    cout<<"true"<<endl; 
else 
    cout<<"false"<<endl; 

Это печать:

-1 2 1 

false 

, что означает:

  • cur = -1
  • list.size()-1 = 2
  • cur > list.size()-1 == true, т.е. -1 > 2

но другой, если говорит, что это ложь и математике сказать то же самое.

Мой GCC версии: GCC версии 4.8.0 (rev2, Построенный MinGW-строит проект)

я проблема или GCC?

+0

Где вы проверяете, что cur> list.size() -1 == true? – user2548635

+1

Что такое тип данных 'cur'? –

+0

list.size() is 3 cuz i print cout << (list.size() - 1), и он печатает 2 – brlebtag

ответ

2

Возможно, cur подписан и list.size является неподписанным.

Тогда в этом выражении:

cur > (list.size()-1) 

cur конвертируется в беззнаковое, поэтому значение true.


Вы можете попробовать этот простой образец, c получает значение false.

int a = -1; 
unsigned int b = 1; 
bool c = a < b; 
1

Ответ можно найти в 5/9 (правил для бинарных операторов):

В противном случае интеграл акция (4.5) должна быть выполнена на обоих операндов. Тогда следующие правила должны применяться к рекламируемому операндов:

...

В противном случае оба операнд должен быть преобразован к типу целого числа без знака , соответствующего типу операнда с подписанными целочисленный тип

Итак, в этом случае мы проводим целую кучу правил интегральной рекламы и, наконец, завершаем это. Это говорит о том, что ваш cur будет повышен до unsigned (тип возврата из метода size), который является четко определенной операцией для выполнения арифметики по модулю. Тогда он будет самым большим unsigned int и будет больше размера вашего контейнера.

Смежные вопросы