Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Последовательность вычислений на Си

#c


Массив char m[] надо превратить в строку, заменив последний элемент нулём. Количество
элементов в массиве i. Будет ли правильно написать  

m[--i]=0;  


или i будет уменьшено уже после присвоения и произойдёт выход за границы массива?
Как написать правильно?
    


Ответы

Ответ 1



m[--i]=0; Сначала будет выполнен декремент, а потом присваивание, как если бы код был --i; m[i]=0; И наоборот: m[i--]=0; Сначала будет выполнено присваивание, а потом декремент, как если бы код был m[i]=0; i--;

Ответ 2



Здесь нет никакого "до" и "после" и рассуждать о поведении этого кода в таких терминах - грубая ошибка. Никакого "декремент выполнится до" и "присваивание выполнится после" тут гарантировать нельзя. Но это и не нужно. Все, что вам нужно знать в данном случае - это то, что индексом массива у вас является результат выражения --i. По определению, результатом выражения --i является исходное значение i уменьшенное на 1. То есть доступ к элементу массива у вас эквивалентен m[<исходное значение i> - 1] и никакого выхода за пределы массива здесь не будет. Порядок вычисления тут никакой роли не играет и в какой момент произойдет изменение значения самого i (до или после) вас интересовать не должно. В языке С это не оговаривается.

Комментариев нет:

Отправить комментарий