Это зависит от того, где объявлено i
, и от того, сможет ли компилятор выяснить, есть ли шанс, что он может быть изменен во время выполнения.
Например, если ваш код выглядел так:
...
int i = 3;
int x = 128 + 7 - i;
...
компилятор может выяснить, что нет способа, которым i
мог бы измениться, прежде чем он был использован в вашем выражении. В этом случае он может быть встроен как константное выражение во время компиляции.
Если, однако, это было бы так:
-(void) doSomething:(int) i {
...
int x = 128 + 7 - i;
...
}
Значение может изменяться во время выполнения в зависимости от параметра метода, в этом случае оно не может быть постоянным для компилятора.
Помните, что компилятор может выполнять оптимизацию, подобную описанной выше, зависит от настроек компилятора. Например, в отладочных сборках это наверняка не будет сделано.
РЕДАКТИРОВАТЬ : Как правильно указал Руди Велтуис в комментариях, я был слишком быстр в своем ответе. На самом деле, первый пример на самом деле не является константным выражением, о котором вам (очень явно) скажет компилятор. Я не учел, что константное выражение является фиксированным термином с четким определением (например, см. Спецификацию языка Java здесь , сейчас у вас нет версии на C). Вместо этого я перепутал это с техникой оптимизации компилятора, которая посредством анализа потока данных внутри метода позволила бы ему заменить вышеупомянутый код постоянным значением.