Хорошее объяснение того, что происходит при таком вычислении, содержится в документе n1188 из сайта ISO W14 .
Я объясняю идеи.
Основным правилом стандарта ISO 9899, который применяется в этой ситуации, является 6.5p2.
Между предыдущей и следующей точкой последовательности объект должен иметь свое сохраненное значение не более чем один раз, оценивая выражение. Кроме того, предыдущее значение должно быть считано только для определения значения, которое нужно сохранить.
blockquote>Точки последовательности в выражении типа
i=i++
находятся передi=
и послеi++
.В документе, который я привел выше, объясняется, что вы можете определить, что программа сформирована маленькими ящиками, каждая из которых содержит инструкции между двумя последовательными точками последовательности. Точки последовательности определены в приложении C стандарта, в случае
i=i++
есть две точки последовательности, которые ограничивают полное выражение. Такое выражение синтаксически эквивалентно записиexpression-statement
в форме грамматики Бэксу-Наура (грамматика приведена в приложении A стандарта).Таким образом, порядок инструкций внутри ящика не имеет четкого порядка.
i=i++
можно интерпретировать как
tmp = i i=i+1 i = tmp
или как
tmp = i i = tmp i=i+1
, поскольку обе эти формы интерпретируют код
i=i++
являются действительными и потому, что оба генерируют разные ответы, поведение не определено.Таким образом, точка последовательности может быть видна в начале и в конце каждого окна, которое составляет программу [поля представляют собой атомные единицы в C] и внутри ящика порядок команд не определен во всех случаях. Изменение этого порядка иногда может изменить результат.
EDIT:
Другим хорошим источником для объяснения таких неоднозначностей являются записи с сайта c-faq (также опубликованный как книга ), а именно здесь и здесь и здесь .
Можете ли вы запустить терминал на удаленном компьютере и использовать kill -INT
для отправки сигнала?
Попробуйте signal SIGINT
в командной строке gdb.
Похоже, вы делаете ctrl + c. Проблема заключается в том, что ваше оконное окно отправляет SIGINT в процесс ssh, выполняемый локально, а не в процесс на удаленной системе.
Вам нужно будет указать сигнал вручную с помощью команды kill
или системы вызовите удаленную систему.
или более удобно с помощью killall
$killall -INT gdb