zHz00 Untitled

среда, 07 июля 2021
04:48 Номерок на ладони
Не помню, писал об этом или нет, но написать ещё раз -- лишним не будет.

Почему я повесил на работе рядом со столом таблицу приоритетов операций в Си/Си++? Потому что не все они очевидны -- и я на этом накалывался.

Главный прикол для меня -- это битовые операции. Например, проверим, чему равен последний бит числа:

if(a&0x1==1)
//если последний бит числа установлен, то сделать что-либо

Как бы не так. Битовые операции имеют приоритет НИЖЕ, чем сравнение. Видимо, считается, что они являются аналогами обычных логических операций, таких как &&, однако это не так. Битовые операции ближе к арифметическим. А арифметические выше, чем сравнения. Противоречие.

Как же выполняется это условие?

if(a&(1==1))
//...

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

Ну что, Minoru, помог бы мне твой -Wall?

@темы: Программирование, Борьба с техникой

URL
Интересно, почему европейское кино в массе своей интересн...
19 июня 1997 года. ГАИшники диву давались, когда им ...
[*]Неплохой итальянский сайт, посвященный мебели. [*]Евр...
Мне нравится буква "Э": Энергия, эволюция, эг...
сегодня переехала на новое место на работе, когдау уходил...
* Бывает страшно смотреть в отрешенные глаза новых люде...

07.07.2021 в 12:44

07.07.2021 в 12:44
в си приоритеты такие странные по историческим причинам
си++ этот бред переняла и тянет совместимость
а люди уже 30 лет не понимают почему так )))
URL

07.07.2021 в 12:47

07.07.2021 в 12:47
Да.

igel@kuroneko:~$ cat a.c
#include <stdio.h>


int main(void) {
    int a = 1212312;
    if (a&0x1==1) {
        printf("Jeronimo!");
    }


}


igel@kuroneko:~$ gcc a.c -Wall
a.c: In function ‘main’:
a.c:5:10: warning: suggest parentheses around comparison in operand of ‘&’ [-Wparentheses]
    5 |     if (a&0x1==1) {
      |          ^

igel@kuroneko:~$ g++ a.c -Wall
a.cpp: In function ‘int main()’:
a.cpp:5:14: warning: suggest parentheses around comparison in operand of ‘&’ [-Wparentheses]
    5 |     if (a&0x1==1) {
      |           ~~~^~~
URL

07.07.2021 в 12:55

07.07.2021 в 12:55
Скобки рулят )
URL

07.07.2021 в 15:59

07.07.2021 в 15:59
korrshun, спасибо :)

zhz00, а вот ты возьми и включи теперь -Wparetheses. Не обязательно весь -Wall сразу включать, можно по одному предупреждению…

-- Minoru
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail