2010-10-18 2 views
23

Недавно я узнал об операторе , и о том, что он вводит точку последовательности .Я = 0, ++ i определен?

Я также узнал, что следующий код привел к неопределенному поведению:

i = ++i; 

Поскольку i был изменен дважды между двумя точками последовательности.

А как насчет следующих кодов?

i = 0, ++i; 
i = (0, ++i); 

Хотя я знаю правила, я не могу прийти к выводу. Так это определено поведение или нет?

редактировать: Подобно тому, как @paxdiablo упоминает, определено или не, это действительно плохая практика которой следует избегать. Этот вопрос задается исключительно для образовательных целей и лучшего понимания «правил».

+21

Я не знаю, почему люди так задают вопросы. Неважно, не определено ли это, это дерьмовый код. Вы не должны его использовать, иначе или иначе. – paxdiablo

+10

@paxdiablo: Вы действительно думаете, что я использую такое бесполезное заявление в реальном коде?! Это лучше понять правила. Больше ничего. – ereOn

+0

@ereOn хорошо учиться правилам, это правда. Но через некоторое время опыт обычно приводит кодеров, чтобы избежать каких-либо конструкций, которые не являются четко определенными и широко используемыми на всех платформах. –

ответ

27

Да. = имеет более высокий приоритет, чем ,, поэтому это выражение эквивалентно (i = 0), ++i. , - это точка последовательности, поэтому гарантируется, что ++i возникает после назначения.

Я не уверен, определен ли i = (0, ++i). Я предполагаю, что нет; между приращением и назначением нет точки последовательности.

+0

Я подошел к той же интуиции, но факт, что я не могу быть уверен, меня сильно беспокоит. Благодарю. – ereOn

+0

@ereOn: Моя интуиция такова, что стандарт не гарантирует ее, она не определена. –

+0

Из-за круглых скобок приращение будет оценено до назначения, поэтому я также думаю, что оно будет неопределенным. – codymanix

7
i = 0, ++i; 

Как указывалось в другом ответе, это не неопределенное поведение.

i = (0, ++i); 

поведение не определено в данном случае, потому что нет смысла последовательности между ++i и присвоения I.

i = (0, ++i, 0) 

Поведение корректно определено в C++ 03, ИМХО.

См. extended discussion для аналогичного выражения.

+1

+1. Простой и правильный. – Nawaz

Смежные вопросы