2017-02-02 4 views
0

Почему результат 12 вместо 13 Так что я считаю, что первый k/j оценивается, который дает 0 , тогда j-0 становится 7 , затем 5 + 7 = 12 затем 12 ++ в конце оценки чего-либо , так что ответ должен быть 13, но его 12 Я бы ДЕЙСТВИТЕЛЬНО оценил, если кто-нибудь сможет это объяснить.Я не знаю о до и после инкрементации

int i = 5,j = 7,k = 3; 
    int result = i+++j-k/j; 
    printf("%d",result); 
+1

Ответ 5 плюс 7, так как вы добавляете 'i'. – user3386109

+0

'12 ++' не имеет смысла, поскольку '12' не является переменной. –

+0

* «Я не знаю о до и после приращения» * - Так что узнайте что-нибудь о них! - https://www.youtube.com/watch?v=FkxFPJG5paw –

ответ

0
i+++j-k/j == i++ + j - k/j 

порядок оценки:

1) k/j = 0 
3) i++ + j 
    5++ + 7 = 12 
3) (i+++j)-k/j 
    12-0 = 12 

Теперь я будет увеличен до 6

Так ответ 12 не 13.

Чтобы получить 13 попробовать это

++i+j-k/j; 
+2

Операции с равным приоритетом обычно выполняются слева направо (есть несколько исключений из этого правила). –

+0

Ваш «оценочный заказ» - это возможный заказ, но не гарантируется, например. 'i + j' может быть оценен до' k/j' –

+0

@JohnHascall Я думаю, что вы смешиваете ассоциативность с порядком оценки.'f() - g() - h()' лево-ассоциативный, но функции могут вызываться в любом порядке. –

2

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

int result = i++ + j - k/j; 

Или

int result = 5 + 7 - 3/7; 

С i++ приращений iпосле она была оценена, i 5 для расчета и 6 после.

Отдела имеет более высокий приоритет, чем сложение или вычитание, так что это действительно так:

int result = 5 + 7 - (3/7); 

Все целая математика имеет дробную часть укороченной, так 3/7 является 0.

int result = 5 + 7 - 0; 

Там ваш 12 .

И поэтому лучше избегать полагаться на природу прирастающих операторов в более крупных выражениях, они делают выражения трудно понять и подвержены ошибкам. Либо использовать их отдельно как стенографию для i += 1, как в for(int i = 0; i < something; i++), или написать i += 1.

+0

so ++ никогда не применяется? – noobPoopDeck

+1

@noobPoopDeck Применяется, но это 'i' и *** после ***' i' используется. Распечатайте 'i', и вы увидите, что это 6. – Schwern

1

Этого

int result = (i + j) - (k/j); i = i + 1; 

Матчи фактических операций сделали.

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