Является ли пустой оператор в языках программирования как C, Java, ... no-op в Ассемблере? - PullRequest
4 голосов
/ 30 августа 2011

Несколько дней назад я увидел, что for ( ; ; ) приводит к бесконечному циклу. Это заставило меня задуматься о двух вещах.

  1. Пустой оператор (;) no-op в ассемблере
  2. Почему оно оценивается как "истинное" в приведенном выше примере?

1 Ответ

6 голосов
/ 30 августа 2011

Ответ с точки зрения C здесь:

Нет, ; не переводится в безоперационную инструкцию. Безоперационные инструкции (например, nop) являются явными инструкциями на уровне сборки, которые, как правило, делают что-то (в том смысле, что они потребляют время, хотя не обязательно влияют на любое сохраненное состояние в ЦП).

Фрагмент for(;;) - это цикл for со значениями по умолчанию для каждого из трех разделов. Вы можете думать, что ; в этом случае не пустой оператор, а разделитель для разделов (a) .

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

В прошлом я был виновен в отвратительном преступлении использования таких вещей, как:

#define ever ;;
#define forever for (;;)

чтобы я мог написать свои бесконечные циклы как:

for(ever) { ... }
forever { ... }

В наше время я бы, конечно, этого не сделал.


(a) «Истинное» пустое утверждение в виде:

if (condition) {
    a = b;
    ;
}

также, вероятно, не будет переводиться в no-op. Скорее всего, это не приведет ни к какому коду.

Имейте в виду, это основано на довольно распространенном поведении. С точки зрения C ; может генерировать любой код более низкого уровня, который ему нужен, если только он не влияет на «виртуальную машину», которая является средой C. Это может, например, увеличить переменную скрытого номера строки и обновить статистику покрытия, если у вас включено профилирование.

...