2010-01-15 3 views
8

Включает ли следующий код UB?Вызывает ли следующий код UB?

int main(){ 
    volatile int i = 0; 
    volatile int* p = &i; 
    int j = ++i * *p; 
} 
+4

@Prasoon: Неправильно редактировать сообщения других, чтобы отформатировать их код с вашим любимым стилем отступов. Разве вы не читали рекомендации StackOverflow - «Уважайте оригинального автора»? (> _ <) –

ответ

6

Да что Неопределенное поведение, потому что вы пытаетесь нарушить второе правило ..

Стандарт утверждает, что

1) Между предыдущей и следующей точкой последовательности объект должен иметь свой запомненное значение, измененное не более одного раза путем оценки выражения.

2) Кроме того, к первому значению следует обращаться только для определения значения, которое необходимо сохранить.

Примечание: Порядок оценки операндов * оператора неопределенные и *p не что иное, как i.

+0

Вы имеете в виду '*' оператор, я думаю ... –

+0

Yeah typo: P ....... отредактировал мое сообщение :) –

+1

@Prasoon: Неправильно редактировать сообщения других, чтобы отформатировать их код с любимым стиль отступов. Разве вы не читали рекомендации StackOverflow - «Уважайте оригинального автора»? (> _ <) –

9

Да - либо ++ i, либо * p (который является i) может быть оценен первым.

+0

, но независимо от порядка оценки результат будет таким же? –

+1

Нет. Если ++ i оценивается сначала, у вас есть 1 * 1. Если сначала оценивается * p, у вас есть 1 * 0. – 2010-01-15 13:47:37

+0

К сожалению! Как я этого не заметил? Спасибо за ответ! –