На этом веб-сайте в последнем разделе они предоставили f(i = -1, i = -1)
в качестве примера. неопределенного поведения из-за непоследовательного вычисления подвыражений в аргументах функции. Но поскольку после оценки всех аргументов функции и указателя функции и перед фактическим вызовом функции есть точка следования, f
всегда будет вызываться с (-1, -1)
, а i
будет назначаться -1
. Есть ли вероятность, что этого не произойдет?
Неопределенное поведение в C
Ответы (2)
... есть точка последовательности после оценки
Конечно. После оценки, так что это бесполезно. Проблема здесь в том, что есть два непоследовательных побочных эффекта на i
перед точкой последовательности. Формально это УБ.
person
Lundin
schedule
10.02.2021
Если бы i присваивались разные значения, то оно было бы неопределенным, поскольку значение i нельзя предвидеть... Но в этом случае я всегда оценивал бы значение -1.. Разве это не так?
- person Sourav Kannantha B; 10.02.2021
@SouravKannanthaB Нет, значение не имеет значения. Предположим, у нас есть какой-то экзотический сценарий, в котором
i
является энергозависимым аппаратным регистром, и каждая запись в него вызывает какие-то изменения в аппаратном обеспечении. Точно не определено, когда и сколько раз этот код будет записывать в этот аппаратный регистр.
- person Lundin; 10.02.2021
@SouravKannanthaB В более реалистичном примере, таком как основной компилятор x86 для ПК, он, вероятно, попытается сделать что-то, казалось бы, полезное из ситуации, и, скорее всего, просто передаст значение -1. Но нет никаких гарантий какого-либо конкретного поведения, просто вопрос качества реализации выходит за рамки языка C.
- person Lundin; 10.02.2021
Это неопределенное поведение, потому что так говорит стандарт. Изменение переменной без точки следования между изменениями называется UB. Нет, если обе модификации не устанавливают одно и то же значение исключения из правила.
person
bolov
schedule
10.02.2021
Таким образом, вы имеете в виду «с этими конкретными значениями», это может привести к ожидаемому поведению, но подобное выражение с двумя разными значениями приведет к неопределенному поведению. Конечно...
- person Sourav Kannantha B; 10.02.2021
@SouravKannanthaB Нет, это означает: [...] нет исключений из правил.
- person Ian Abbott; 10.02.2021
i
(глобальную переменную?) - person pmg   schedule 10.02.2021i
и затем уменьшая его, и чередовать операции как clear i; очистить я; уменьшить i; уменьшить i; что в данном случае... - person supercat   schedule 10.02.2021