2017-02-11 5 views
2

У меня проблема с домашней работой, на которую я знаю ответ, но не понимаю, почему это ответ вообще, и просто надеялся найти кого-то, кто может объяснить это мне.Арифметическое объяснение битового сдвига (C)

#include <stdio.h> 

int main(void){ 
    int a = 0, b = 1, c; 
    c = a << b + b << a; 

    printf("d%\n",c); 
    return 0; 
} 

Таким образом, ответ выходит так, что C = '0'. Я думал, что 'a < < b' будет эквивалентен 0, 'b < < a' выйдет до 1, и поэтому 'c = 0 + 1'. Почему это неправильно?

И все же, когда я пытаюсь:

c = b << a + a << b 

C равен '2'. Что делает меня еще менее понятным. Я был бы так благодарен, если бы кто-нибудь мог объяснить мне, почему это работает так, или указать мне на какую-то ссылку, которая разъясняет мне это поведение.

ответ

3

языка грамматика (или "оператор старшинства", если вы будете) говорит, что

c = a << b + b << a; 

фактически

c = ((a << (b + b)) << a); 

Это выражение сдвиги вокруг значения a и больше ничего. Поскольку значение a равно 0, результатом может быть не что иное, как 0.

Та же группировка говорит вам, что

c = b << a + a << b; 

является

c = ((b << (a + a)) << b); 

который

c = ((1 << 0) << 1); 

И вот где что 2 пришел.

+0

Это имеет смысл, спасибо! – M4v

1

Порядок действий. Оператор << имеет более низкий приоритет, чем оператор +, так что:

  • 0 << 1 + 1 << 0 является 0 << (1 + 1) << 0, который является 0 << 2 << 0 что, конечно, 0.

  • 1 << 0 + 1 << 0 является 1 << (0 + 1) << 0, который 1 << 1 << 0, который, конечно, 2.

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

+0

Мне не дали скобки в вопросе, и, видимо, я не знаю своего порядка операций, как и думал, что знаю. Спасибо! – M4v

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