Пост декремент в то время как состояние в C - PullRequest
4 голосов
/ 21 марта 2011

Я выполнил поиск и не нашел ничего, имеющего отношение к моему запросу. В настоящее время я отлаживаю оптимизатор C и рассматриваемый код выглядит следующим образом:

while( x-- )
array[x] = NULL;

Что должно произойти в этом случае? И должен ли результат этой логики быть одинаковым для всех компиляторов?

Допустим, что начальное значение x в этом случае равно 5.

Проблема в том, что программа аварийно завершает работу, насколько я понимаю, она вызвана отрицательной ссылкой на элемент массива.

Любая помощь будет оценена.

Ответы [ 3 ]

7 голосов
/ 21 марта 2011

Этот цикл заканчивается с x, равным -1 (при условии, что x подписано), но его тело не будет создавать доступ к array[-1] на последнем шаге.Последний доступ к массиву - array[0].Поведение является одинаковым для всех реализаций.

Другими словами, в коде, который вы цитировали, нет проблем с доступом к массиву отрицательных индексов.Но если вы попытаетесь получить доступ к array[x] сразу после цикла, тогда вы действительно получите доступ к array[-1].

Код, который вы процитировали, представляет собой вариант довольно известного шаблона реализации, используемого, когда нужноитерация в обратном направлении по массиву с использованием переменной unsigned в качестве индекса.Например,

unsigned x;
int a[5];

for (x = 5; x-- > 0; )
  a[x] = 0;

Иногда менее опытным программистам трудно использовать индексы без знака при повторной итерации по массиву.(Так как переменные без знака никогда не имеют отрицательных значений, наивная реализация условия завершения цикла как x >= 0 не работает.) Этот подход - то есть постинкремент в условии завершения цикла - это то, что работает в таких случаях.(Конечно, он работает и со знаковыми индексами).

2 голосов
/ 21 марта 2011

Если начальное значение x равно 5, оно будет выполняться:

array[4] = NULL;
array[3] = NULL;
array[2] = NULL;
array[1] = NULL;
array[0] = NULL;

Если x является типом со знаком, то окончательное значение x будет -1;в противном случае это будет максимальное значение типа.

0 голосов
/ 21 марта 2011

Перед обработкой цикла while убедитесь, что x не отрицательно (предварительное условие). Также значение x будет равно -1, когда процесс выйдет из цикла while (постусловие). Поэтому после выхода из цикла while вам не следует обращаться к array, используя x в качестве индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...