Включает ли следующий код UB?Вызывает ли следующий код UB?
int main(){
volatile int i = 0;
volatile int* p = &i;
int j = ++i * *p;
}
Включает ли следующий код UB?Вызывает ли следующий код UB?
int main(){
volatile int i = 0;
volatile int* p = &i;
int j = ++i * *p;
}
Да что Неопределенное поведение, потому что вы пытаетесь нарушить второе правило ..
Стандарт утверждает, что
1) Между предыдущей и следующей точкой последовательности объект должен иметь свой запомненное значение, измененное не более одного раза путем оценки выражения.
2) Кроме того, к первому значению следует обращаться только для определения значения, которое необходимо сохранить.
Примечание: Порядок оценки операндов *
оператора неопределенные и *p
не что иное, как i
.
Вы имеете в виду '*' оператор, я думаю ... –
Yeah typo: P ....... отредактировал мое сообщение :) –
@Prasoon: Неправильно редактировать сообщения других, чтобы отформатировать их код с любимым стиль отступов. Разве вы не читали рекомендации StackOverflow - «Уважайте оригинального автора»? (> _ <) –
Да - либо ++ i, либо * p (который является i) может быть оценен первым.
, но независимо от порядка оценки результат будет таким же? –
Нет. Если ++ i оценивается сначала, у вас есть 1 * 1. Если сначала оценивается * p, у вас есть 1 * 0. – 2010-01-15 13:47:37
К сожалению! Как я этого не заметил? Спасибо за ответ! –
@Prasoon: Неправильно редактировать сообщения других, чтобы отформатировать их код с вашим любимым стилем отступов. Разве вы не читали рекомендации StackOverflow - «Уважайте оригинального автора»? (> _ <) –