2013-08-14 3 views
0

Я путаюсь между приоритетом операторов и хочу знать, как будет оцениваться этот оператор.C Программирование: путаница между приоритетом оператора

# include <stdio.h> 

int main() 
{ 
    int k=35; 
    printf("%d %d %d",k==35,k=50,k>40); 
    return 0; 
} 

Здесь k изначально имеют значение 35, когда я тестирую k в printf я думаю:

  1. k>40 должны быть проверены, которые должны привести к 0
  2. k==35 должны быть проверены и которые должны результат 1
  3. Наконец, 50 должно быть присвоено k и должно выдавать 50

Таким образом, окончательный выход должен быть 1 50 0, но выход 0 50 1.

+2

Это пример поведения 'undefined' –

+0

Здесь приоритет оператора не имеет значения. – harold

+0

на gcc версии 4.4.3 это '0 50 0', потому что это НЕОПРЕДЕЛЕННОЕ поведение :( –

ответ

0

Порядок, в котором вычисляются аргументы функции, не указан. Их можно оценить в любом порядке. Компилятор решает.

6

Вы не можете полагаться на выходе этой программы, поскольку она является undefined behavior, порядок вычисления не указан в C так, что позволяет компилятору оптимизировать лучше, из C99 проекта типового раздела 6.5 пункт 3:

группировка операторов и операндов обозначается syntax.74) за исключением случаев, указанных позже (для вызова функции(), & &, ||,?:, и операторы запятой), порядок вычисления из подвыражения и порядок, в которых происходят побочные эффекты, являются как unsp ecified.

Это также не определено, потому что вы обращаетесь к стоимости k и присвоение ему в том же sequence point. Из проекта пункта стандартного раздела 6.52:

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

он приводит следующие примеры кода, как быть определено:

i = ++i + 1; 
a[i++] = i; 

Update

Был комментарий, чтобы ли запятые в вызове функции действовал в качестве точки последовательности или не. Если мы посмотрим на раздел 6.5.17 Comma operator пункта 2 говорит:

Левый операнд оператора запятая оценивается как выражение недействительным; после оценки оценка .

, но пункт 3 говорит:

Пример Как указано в синтаксисе, оператор запятой (как описано в данном подпункте) не может появиться в контекстах, где запятая используется для разделения элементов в список (например, аргументы для функций или списки инициализаторов).

Таким образом, в этом случае запятая не вводит точку последовательности.

0

Это undefined behaviour.

Вы можете получить любую ценность. Недостаток sequence points в двух последовательных исполнениях. Увеличьте уровень строгости для предупреждения, и вы получите warning: operation on ‘k’ may be undefined.

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