Цитата(KSN @ Dec 9 2005, 14:23)

Вот небольшой фрагмент кода:
ktmp=0;
PultFlag=4;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0;
ktmp=0;
PultFlag=5;
for(pult=0;pult<3;pult++)
ktmp|= ((PultFlag>>pult)&0x01)?(1<<pult):0;
Дык. После первого цикла значение ktmp не используется. Более того, сразу после этого ему конкретно присваивается 0. С точки зрения компилятора и здравого смысла работа, произведенная в первом цикле сделана впустую. И оптимизатор совершенно справедливо удаляет этот ненужный код, уменьшая размер программы и увеличивая скорость ее работы. В этом весь смысл оптимизации и состоит. Если Вам надо проследить за значениями и подавить оптимизацию, то объявите ktmp как volatile. Так часто делают при отладке, когда надо отследить промежуточные значения. В этом случае компилятор не будет ничего оптимизировать в части этой переменной.
Цитата(KSN @ Dec 9 2005, 14:23)

Я так полагаю, что не стоит полагаться на оптимизацию компилятора, надо самому грамотно писать программу.
Истину глаголите.

volatile.
«Отыщи всему начало, и ты многое поймёшь» К. Прутков