Ответ с точки зрения C здесь:
Нет, ;
не переводится в безоперационную инструкцию. Безоперационные инструкции (например, nop
) являются явными инструкциями на уровне сборки, которые, как правило, делают что-то (в том смысле, что они потребляют время, хотя не обязательно влияют на любое сохраненное состояние в ЦП).
Фрагмент for(;;)
- это цикл for
со значениями по умолчанию для каждого из трех разделов. Вы можете думать, что ;
в этом случае не пустой оператор, а разделитель для разделов (a) .
- Первый раздел (инициализация) имеет значение по умолчанию "ничего не делать".
- Второй раздел - это условие, при котором цикл будет продолжаться. По умолчанию он продолжается вечно.
- Третий раздел, шаги, которые необходимо выполнить перед началом следующей итерации, также "ничего не делать".
В прошлом я был виновен в отвратительном преступлении использования таких вещей, как:
#define ever ;;
#define forever for (;;)
чтобы я мог написать свои бесконечные циклы как:
for(ever) { ... }
forever { ... }
В наше время я бы, конечно, этого не сделал.
(a) «Истинное» пустое утверждение в виде:
if (condition) {
a = b;
;
}
также, вероятно, не будет переводиться в no-op. Скорее всего, это не приведет ни к какому коду.
Имейте в виду, это основано на довольно распространенном поведении. С точки зрения C ;
может генерировать любой код более низкого уровня, который ему нужен, если только он не влияет на «виртуальную машину», которая является средой C. Это может, например, увеличить переменную скрытого номера строки и обновить статистику покрытия, если у вас включено профилирование.