2016-08-26 5 views
0

Я знаю, что несколько выражений оцениваются справа налево. Ex:Оценка выражений внутри printf в C

int i = 0; 
printf("%d %d %d", i, i++, i++); // Prints 2 1 0 

Но когда дело доходит до каждого выражения для оценки, я не получаю, если она справа налево или наоборот.

int main() 
{ 
    int a = 1, b = 1, d = 1; 
    printf("%d", a + ++a); // Result = 4 
} 

Учитывая оценку слева направо, предшествующий код должен быть оценен как 1 + 2 = 3

int main() 
{ 
    int a = 1, b = 1, d = 1; 
    printf("%d", ++a + a); // Result = 4 
} 

И это следует оценить как 2 + 2 = 4

Но в обоих в случаях, когда ответ равен 4.

Может ли кто-нибудь объяснить, как эти выражения оцениваются?

+1

_I знаю, что несколько выражений оцениваются справа налево. Пример: _ 'int i = 0; printf ("% d% d% d", i, i ++, i ++); // Prints 2 1 0': ** Неверно **, это неопределенное поведение. –

+0

@AlterMann Этот вопрос содержит 2 вопроса: порядок оценки аргументов функции и плохо упорядоченные операции одной и той же переменной в одном выражении. Этот дубликат объясняет только последнее, я снова открою это. – Lundin

+1

@Lundin Таким образом, вы неправильно открыли его. Дубликат на самом деле объясняет порядок: http://stackoverflow.com/a/18260171/4082723, http://stackoverflow.com/a/949508/4082723 – 2501

ответ

2

Я знаю, что несколько выражений оцениваются справа налево.

№ Порядок оценки функциональных параметров - неуказанное поведение. Значение не может знать заказ, он может отличаться от системы к системе или даже от вызова функции вызова функции. Вы никогда не должны писать программы, которые полагаются на этот порядок оценки.

Кроме того, нет никакой точки последовательности между оценкой параметров функции, поэтому код printf("%d", ++a + a); также вызывает неопределенное поведение, см. Why are these constructs (using ++) undefined behavior?.

Обратите внимание, что приоритет оператора и ассоциативность операторов гарантируют только порядок, в котором выполняется разбор выражения! Это не связано с порядком оценки операндов. (С некоторыми особыми исключениями, такими как || && , ?: операторов.)

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

  • Нет связанных вопросов^_^