04:48
Номерок на ладони
Не помню, писал об этом или нет, но написать ещё раз -- лишним не будет.
Почему я повесил на работе рядом со столом таблицу приоритетов операций в Си/Си++? Потому что не все они очевидны -- и я на этом накалывался.
Главный прикол для меня -- это битовые операции. Например, проверим, чему равен последний бит числа:
if(a&0x1==1)
//если последний бит числа установлен, то сделать что-либо
Как бы не так. Битовые операции имеют приоритет НИЖЕ, чем сравнение. Видимо, считается, что они являются аналогами обычных логических операций, таких как &&, однако это не так. Битовые операции ближе к арифметическим. А арифметические выше, чем сравнения. Противоречие.
Как же выполняется это условие?
if(a&(1==1))
//...
Вот так. По чудесному стечению обстоятельств эта конструкция будет работать. Но если бы мы, к примеру, проверяли предпоследний бит, нас бы ждал сюрприз.
Ну что, Minoru, помог бы мне твой -Wall?
Почему я повесил на работе рядом со столом таблицу приоритетов операций в Си/Си++? Потому что не все они очевидны -- и я на этом накалывался.
Главный прикол для меня -- это битовые операции. Например, проверим, чему равен последний бит числа:
if(a&0x1==1)
//если последний бит числа установлен, то сделать что-либо
Как бы не так. Битовые операции имеют приоритет НИЖЕ, чем сравнение. Видимо, считается, что они являются аналогами обычных логических операций, таких как &&, однако это не так. Битовые операции ближе к арифметическим. А арифметические выше, чем сравнения. Противоречие.
Как же выполняется это условие?
if(a&(1==1))
//...
Вот так. По чудесному стечению обстоятельств эта конструкция будет работать. Но если бы мы, к примеру, проверяли предпоследний бит, нас бы ждал сюрприз.
Ну что, Minoru, помог бы мне твой -Wall?
07.07.2021 в 12:44
си++ этот бред переняла и тянет совместимость
а люди уже 30 лет не понимают почему так )))
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) {
| ~~~^~~
07.07.2021 в 12:55
07.07.2021 в 15:59
zhz00, а вот ты возьми и включи теперь -Wparetheses. Не обязательно весь -Wall сразу включать, можно по одному предупреждению…
-- Minoru