Глей ся. Има едно малко нещо, което не го отчиташ.
Без значение каква е имплементацията на оператора ++, без значение дали е постфиксен или инфиксен, без значение дори и типа на обекта i:
Имаш
i = 0;
while(++i);
Каквото и да прави оператор ++ в крайна сметка резултатът зависи от очакването на оператора while(). А то според стандарта изчислява израз, който ако не е 0 (забележи - тук не говорим за true, false, истина, лъжа) ще доведе до повторно изчисляване на израза. И така докато изразът не стане 0. Когато изразът стане 0 - изпълнението продължава извън блока на while().
От тук веднага отпадат всякакви разсъждения относно натурата на обекта i, реализацията на оператора ++ и прочие.
Или с други думи:
Какъвто и да е обекта i, какъвто и да е оператора ++ резултата от ++i трябва да е вграден скаларен интегрален тип. Т.е. int, short, char, long и техните unsigned еквиваленти. И забележи - говорим за интегрални типове само (т.е. double и float не стават - те автоматично се свеждат до интегрални типове).
Това означава, че за класа на i ти трябват овърлоаднати ++ оператор (пост- или инфиксен) както и оператор int, long, char, short или unsigned еквивалент.
Разбира се тук не можем да говорим за крайност на цикъла. Ако оператора ++ не прави нищо ами връща 1 например цикълът е безкраен.
Ако приемем, че типа е на i е интегрален, то цикълът ще се врътка докато променливата не се нулира.
Заключение: колкото и памет да заемаш, каквито и големи числа да произвеждаш - по-голямо от int не можеш да тестваш в оператора while.
Е, ако се промени условието например:
i = 0;
j = 0;
while(++i > j); тогава можем да говорим за големи числа, памет и прочие.
|