Q:

Меняют ли состояние программы операции ветвления?

Многие операции меняют состояние программы через присваивание, приведение и т.д.
Меняют ли состояние программы операции ветвления (условные операторы)? Или они просто переводят, в зависимости от некоторых условий, в одну из частей общего состояния?
Я так пониманию состояние программы это вся совокупность вычисляемых и/или используемых значений, потенциально изменчивых и/или постоянных в данный момент работающей программы. Могу конечно ошибаться.

A:

Не могу себе представить состояние программы без указателя на текущую выполняемую команду... 
Поэтому считаю, что любая операция ветвления меняет состояние программы. Впрочем, как любая операция вообще - ибо состояние программы в самом начале выполнения и в самом ее конце вряд ли кто-то назовет идентичными, правда? :)

A:

Текст программы лучше всего представить себе в виде набора пересекающихся дорог, а состояние выполняющего эту программу процесса — как машину, едущую по этим дорогам.
При этом ветвлениям соответствуют развилки дорог, циклам — круговое движение, и т. д. Любая операция есть продвижение машины по дороге, ветвление — выбор одной из дорог на развилке и продвижение по выбранной дороге.
Таким образом, ветвление не есть состояние, это лишь свойство «дорожной сети», её форма. А вот прохождение программой ветвления, как и любая другая операция, изменяет положение машины на дороге, то есть, состояние программы.

A:

Предположим, у нас программа на условном императивном языке без многопоточности. Нам нужно прервать выполнение программы, и выгрузить ее текущее состояние в файл, чтобы потом можно было загрузить и продолжить с точки остановки. Что нам нужно выгрузить:

Код (в принципе, он может подгружаться из исполняемого файла, но бывают нюансы типа самораспаковывающихся/самомодифицирующихся программ)
Глобальные переменные
Стек (стек вызовов и стек локальных переменных функций до текущей выполняемой функции включительно)
Адрес/номер строки выполняемой команды на момент создания "снимка" состояния.

Это и есть все, что описывает текущее состояние нашей программы. Если что-то из этого "забыть" выгрузить/загрузить, то просто не получится вернуть программу в требуемое состояние.
Таким образом любая команда (в том числе nop в ассемблере или pass в Python) меняют как минимум адрес/номер текущей выполняемой команды, а значит меняют состояние программы. Операции ветвления тут ничем особенным не выделяются.

