Относительно y = x - x;
, один из худших сценариев, который следует иметь в виду, состоит в том, что неинициализированная переменная может содержать значение прерывания.
Нельзя полагаться на наличие оптимизатора, чтобы понять, что x - x
на самом деле не зависит от значения x
, и поэтому, безусловно, реализации разрешено использовать значение x
при оценке x - x
, и оно используется в абстрактной машине.
Такесли это значение прерывания, у вас возникнет аппаратная ошибка или что-то еще, что делает реализация, когда оно прерывается.UB, в любом случае.
Я помню, что одна система, которую я использовал, добавила дополнительные гарантии о поведении неопределенных значений.Он заявил, что использование неопределенного значения не будет взрываться, но также не должно вести себя так, как если бы это было какое-либо действительное значение типа.Таким образом, x-x
приведет к другому неопределенному значению, не обязательно к 0. Это на самом деле меньше полезнее, чем перехват, поскольку он сохраняет ошибку программирования для последующего использования, когда вы меньше всего этого ожидаете, но AFAIK это полностьюсоответствует, так как поведение не определено стандартом.