Путаница с приоритетом сдвига и арифметических операторов в C - PullRequest
0 голосов
/ 28 декабря 2018

Я новичок в операциях сдвига в C, и я смущен ими.

int x = 2, y, z = 4;
y =  x>>2  +  z<<1;   // this gives the output 0
y = (x>>2) + (z<<1);  // this gives the output 8 

Я ожидал, что оба выхода будут равны 8, но первый дает ноль.Почему это происходит?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Если вы посмотрите на таблицу приоритетов оператора для C, вы увидите, что оператор сложения + имеет более высокий приоритет, чем операторы левого и правого сдвига << и >>.

Итак, это:

y=x>>2 +  z<<1;

То же, что и:

y = (x >> (2 + z) << 1);

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

0 голосов
/ 28 декабря 2018

Этот

y=x>>2 +  z<<1; //this gives the output 0

оценивается как

y=( x>>(2 +  z)) << 1;
        ^^^^this performed first i.e 6, next x>>6 which is 0 and then 0<<1 is zero 

из-за приоритета оператора.См. Страницу руководства оператора ;он говорит, что + имеет более высокий приоритет, чем операторы сдвига.

И это

y=(x>>2) + (z<<1);  //this gives the output 8 

хорошо определено;() имеет наивысший приоритет.

0 голосов
/ 28 декабря 2018

Если вы увидите, например, эту таблицу приоритетов операторов , вы увидите, что оператор + имеет более высокий приоритет, чем операторы сдвига.

Это означает, что выражение x >> 2 + z << 1 фактически равнодо (x >> (2 + z)) << x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...