2016-12-26 3 views
1
a = 5; 
c = (b =a+2) - (a=1); 

В книге c программированием современного подхода к kn king написано, что эффект выполнения второго оператора приведет к 6 или 2, так как это неопределенное поведение c, но в других книгах, таких как c Деннисом написано, что оно будет выполнено слева направо. Какой из них правильный?C язык порядка приоритета

+3

это неопределенное поведение. – BLUEPIXY

+2

Какая черта «C от Денниса»? Если вы говорите о [K & R] (https://en.wikipedia.org/wiki/The_C_Programming_Language), он ничего не говорит о выполнении слева направо. – user2357112

+2

Вы уверены, что король говорит об этом? Какое издание и номер страницы? –

ответ

2

В приведенном выше случае,

c=(b=a+2) -(a=1); 

значение a, изменяется и считывается без точки последовательности между ними, так что это undefined behavior.

Цитирование C11, Приложение §J.2, Неопределенного поведения

Побочного эффект от скалярного объекта unsequenced по отношению к любому другому побочному эффекту на тот же скалярном объект или вычисления значения с помощью значение того же скаляра объект.

Также в связи с главы §6.5

Группировка операторов и операндов обозначается синтаксисом. 85) За исключением случаев, указанных ниже , побочные эффекты и вычисления значений подвыражений не имеют никакого значения. 86)

Таким образом, нет никакой гарантии, подвыражении будет получить оценку первым.

+0

Закрыть, но оценка не является (обязательно) одновременной. –

+0

@KeithThompson Sir, вот почему я положил это в _italics_, можете ли вы предложить альтернативную формулировку? –

+0

Отбросьте слово «одновременно», просто скажите, что точки последовательности нет. –

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