Порядок выполнения операций

Рейтинг: 2Ответов: 3Опубликовано: 31.05.2011

Всем привет, скажите, какой будет порядок операций в while(0 != *input++) {...}? Cначала произойдет "0 != *input", а затем "input++"?

итак, gcc version 4.4.5

Эксперимент:

char * input = (char *)"R142C1543:R18999C24568";
char * tmp = input;
printf("str1 = %s\n", input);
while(0 != *input++) ;
printf("str2 = %s\n", tmp);

Результат:

str1 = R142C1543:R18999C24568
str2 = R142C1543:R18999C24568

Вывод: эксперемент показал, что проход данным циклом по строке не изменяет саму строку.

P.S. сейчас попытался перед первым printf'ом вставит *input = 'T' - выдало ошибку сегментирования.

char * input = (char *)"R142C1543:R18999C24568";
char * tmp = input;

*input = 'T'; // отладчик gdb подтвердил что ошибка сегментирования возникает на этой строчке
printf("str1 = %s\n", input);
while(0 != *input++) ;
printf("str2 = %s\n", tmp);

Ответы

▲ 2Принят

Согласно таблице приоритетов операции будут выполнены в таком порядке:

  1. Обращение к памяти по указателю: *input
  2. Следующей будет операция сравнения: 0 != *input
  3. И операция с самым низким приоритетом: постфиксный инкремент. input++, применяется непосредственно к указателю.

Использовать разыменование в комплекте с инкрементом/декрементом без скобочек надо очень осторожно. Постфиксный оператор применяется в данной ситуации (но согласно приоритету) непосредственно к указателю. Но если требуется увеличить значение памяти, надо использовать соответствующую конструкцию с префиксным оператором или поставить скобочки: ++*index; (*index)++;

Порядок операций специально не оговорен, но следует из синтаксиса (The precedence of operators is not directly specified, but it can be derived from the syntax).

▲ 2

Итак, хотелось бы подвести итог и закрыть тем самым обсуждение, да простит меня @Алексей Сонькин, я использую его пост с небольшой поправочкой.

Согласно таблице приоритетов операции будут выполнены в таком порядке:

Обращение к памяти по указателю: *input

Следующей будет операция сравнения: 0 != *input

И операция с самым низким приоритетом: постфиксный инкремент. input++ // Та самая поправочка

Все операции имеют чёткий порядок следования без каких-либо разногласий. Ознакомиться можно, например, по ссылке "Приоритеты операций"(первая попавшаяся ссылка).

В целом всем спасибо, было приятно пообщаться с умными людьми) Главное нашли ответ на вопрос)

▲ 2

Порядок исполнения операторов в операции:

while(0 != *input++)
  1. Выполняется оператор ++ (постфиксный)
  2. Оператор разыменование указателя * имеет самый низкий приоритет
  3. Сравнивается результат *input++ с нулем

При этом не надо забывать, что постфисный оператор ++ увеличивает на единицу значение переменной, но возвращает старое значение. В результате получаем, что увеличивается раньше разыменования, но разыменование применяется для старого (не увеличенного) значения input. И, как следствие сравнение с нулем выполняется так же с не увеличенным значением *input.

PS: меня позабавили варианты ответов :)