2016-02-10 3 views
-4

Может кто-нибудь объяснить мне, как этот код вычисляется с использованием операторов.Расчет чисел с операторами

#include <stdio.h> 

    int main(void) 
    { 

    int x = 2, y , z; 

    x *= 3; 
    printf("%d\n", x); 
    x = x * (3 + 2); 
    printf("%d\n", x); 
    x *= y = z = 4; 
    printf("%d\n", x); 
    x *= y += z; 
    printf("%d %d %d\n", x, y, z); 

    return 0; 
    } 

В результате я получил следующий вывод:

6,
30,
120,
960, 8, 4,

+0

Вы пытались пошагово с помощью отладчика? Какую часть вы не понимаете? –

+1

Что именно вы не понимаете? – dbush

+0

Как вы можете получить второй результат 120. Isnt x * (3 + 2) = 10? –

ответ

3

Оператор, за которым следует знак равенства, означает, что оператор применяется к переменной слева и переменной справа, а затем присваивается переменной слева. Вы также выполняете операции приоритета. Я расширил значение ниже.

x *= 3; 

такое же, как

x = x * 3; // 6 = 2*3 

круглых скобках показывает порядок приоритета

x = x * (3+2) // x was 6 from the previous line 

это

x = x * 5 // which gives 30 

следующая

x *= y = z = 4; 

означает

z = 4; 
y = z; //which is 4 
x = x *y; // which is 120 = 30 *4 

Следующая

x *= y += z; 

означает

y = y + z ; // y = 4 + 4 (8) 
x = x * y; // x = 120 * 8 (960) 
2

*= умножает левый операндом по правому операнду и присваивает результат левому.

x *= y = z = 4; 

Работы справа налево, назначив 4 г и у, то умножая х на 4.

x *= y += z; 

г добавляется к у и результат присваивается у, то х умножается на у и результат присваивается x.

+0

Как вы можете получить второй результат 120. Isnt x * (3 + 2) = 10? –

+0

x был изменен в предыдущем заявлении x * = 3; это означает, что x = x * 3; и x начальное значение было 2, поэтому после этого оно становится 6. 6 * (3 +2) = 30 30 * 4 = 120 –

+0

Ага это то, что меня беспокоило. Итак, кулак x означает новую ценность, вторая x уже имеет значение из прошлого. –

2

x*=3 означает x=x*3 =>x=2*3=6

x*=(3+2) означает x=x*(3+2) =>x=6*5=30

x*=y=z=4 означает z=4, то y=4, то x=x*y =>x=30*4=120

x*=y+=z означает y=y+z затем x=x*y =>y=4+4=8 затем x=120*8=960.

1
  • Первые два задания просты: умножая x на 3 дает 6, а затем (3+2) дает 30.
  • Третье назначение имеет целую цепочку присвоений: 4 присвоено y и z. Поскольку значение присваивания всегда является значением его левой стороны после назначения, окончательное умножение x *= y умножает x на 4, что дает вам 120.
  • Последняя строка является самой сложной, поскольку она имеет два побочных эффекта. Сначала оценивают y += z, производя 8. После этого x умножается на 8, производя его окончательное значение 960.

Обратите внимание, что в последней строке x умножается на 8, который может или не может быть значением y в момент выполняется умножение.

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