Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Значение выражения


Автор: Trotil 5.4.2010, 19:03
Чему будет равна переменная r 
при x2 = 3, x1 = 1, y2 = 10, y1=5 ?

Код

r = ( (t=x2-x1)*t + (t=y2-y1)*t) 


при типах double и int?

Результаты:

VS: double и int 'r' равно 50.
gcc: int = 50, double = 29!
gcc под MIPS: int = 35, double = 29.

Вопрос: чему это выражение должно быть равно по стандарту? 

(могу расписать, как были получены компилятором эти результаты)

Автор: azesmcar 5.4.2010, 19:03
Цитата(Trotil @  5.4.2010,  19:03 Найти цитируемый пост)
Чему равно следующее выражение 

результат выражения стандартом не определен.
Глава 5 - Expressions

Автор: Trotil 6.4.2010, 09:22
Я думаю, что 29 есть нарушение (независимо от неопределенностей): ведь это 2*2 + 5*5, а по правилам скобки имеют наибольший приоритет, поэтому после действий в скобках t не должно меняться и выделенные жирным множители (t=x2-x1)*t + (t=y2-y1)*t должны быть одинаковыми

Автор: azesmcar 6.4.2010, 09:26
Trotil

Заходим, читаем
Цитата

Unspecified Behavior
behavior, for a well-formed program construct and correct data, that depends on the implementation.

единственная гарантия, которая дается это то, что программа будет скомпилирована. А Undefined Behavior это вообще кошмар...повезет, если компилятор не отформатирует компьютер smile 

Автор: xvr 6.4.2010, 13:35
Цитата(Trotil @ 6.4.2010,  09:22)
Я думаю, что 29 есть нарушение (независимо от неопределенностей): ведь это 2*2 + 5*5, а по правилам скобки имеют наибольший приоритет, поэтому после действий в скобках t не должно меняться

По правилам скобки определяют как компилятор будет понимать записанное выражение. Но они никак не влияют на то, в каком порядке компилятор будет это выражение вычислять.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)