2010-08-25 7 views
3

Еще раз, наши самые любимые проблемы «i = i--». В C99 мы имеем:Существует ли конкретная документация для поведения «i = i--» в gcc?

6.5 Выражения # 2: Между предыдущей и следующей точкой последовательности объект должен быть его сохраненное значение модифицирована более одного раза

70) Этот пункт оказывает !! не определено !! Заявление выражения , такие как

i = ++i + 1; 

Но для undefinded поведения могут быть варианты от случайного выхода на «выполнение программы в документированной форме» (c99 3.4.3)

Итак, вопрос:

Содержит ли gcc поведение для i = i ++, i = i-- и т. Д. Утверждений?

Фактический код

int main(){int i=2;i=i--;return i;} 
+4

Нет, gcc не документирует, что он делает в этом случае. Разработчики Gcc ищут, помимо прочего, скорость сгенерированного кода. Документирование того, что делает этот пример, противоречит этой цели. Создание программистов, которые пишут код, подобный этому примеру, счастлив, не имеет веса по сравнению с улучшением результатов тестов. –

ответ

5

GCC не документирует это поведение. В Warning Options page упоминаются вопросы о точках последовательности в -Wsequence-point, но не намекает на четко определенные семантики нарушений.

У GCC есть хороший список C Implementation Defined Behaviour, но здесь я не нашел ссылки на эту проблему.

+0

Я не уверен, как это происходит сейчас, но в прошлом люди GCC по возможности были открыто про-стандартными. IOW, если стандарт говорит, что он неопределен или неопределен, поэтому он находится в GCC. – Dummy00001

1

Это осталось серверную реализацию, чтобы решить, что он делает. Вы можете использовать -S и проверить сгенерированный код, чтобы определить точную последовательность событий.

+0

Есть ли какой-либо документ о таких случаях? – osgx

+0

и что такое сервер в GCC? Будет ли он отличаться для x86 и sparc, например? – osgx

+1

Неопределенное поведение означает, что все будет честной игрой. Компилятор мог бы генерировать разные коды в разные дни недели. – jamesdlin

1

Это не документировано, но даже это было, я бы не хотел его читать. Вы никогда не должны полагаться на то, что делает конкретная реализация при работе с неопределенным поведением.

+1

Если это будет задокументировано, я могу положиться, что GCC с некоторыми версиями сделает это, что было документировано. Да, мой код будет ошибочным для любого другого компилятора, но не для GCC – osgx

+0

@osgx: Возможно, вы могли бы, но я думаю, что это вызовет намного больше проблем, чем это стоит. Это, например, очень запутанно для людей, читающих ваш код. И почему вы хотите сделать что-то вроде 'i = i -' в любом случае? Вы должны знать, что вы хотите, чтобы это сделать, почему бы просто не произнести это на C++? – Job

+0

этот случай пришел к нам из нашего большого набора тестов, частично написанного нашими тестировщиками. У них есть «очень» различный уровень владения языком C. – osgx

0

Почему бы вам не сделать это? Шутки в сторону. Мне любопытно.

+0

Этот код находится в тестовом наборе компилятора. Этот тестовый набор работает нормально для ** некоторых ** версий gcc. – osgx

+0

Это неопределенное поведение, поэтому любое поведение действительно. Если ваш «тест компилятора» возвращает * недействительный * для любого компилятора, тогда ваш тест будет нарушен, потому что он всегда должен возвращать * valid *, независимо от того, будет ли результат 2, 3, 4 или конец вселенной, как мы это знаем , Разумеется, мы можем nit-pick, если неопределенное поведение всегда имеет правильные или всегда неверные результаты. ;) – Secure

+0

Кстати, вы протестировали, что результаты согласованы на разных уровнях оптимизации? – Secure