Подтвердить что ты не робот

Почему Кланг предупреждает: `` && 'внутри' || '`?

Я понимаю, что круглые скобки не имеют значения, так есть ли какая-либо причина (кроме как "улучшить" ясность кода), что Кланг предупреждает об этом как о стандартном? Я предпочитаю не добавлять круглые скобки, поскольку мне не нравится добавлять код для кодов.

src/websocket.c:420:43: warning: '&&' within '||' [-Wlogical-op-parentheses]
        if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) {
                              ~~ ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
src/websocket.c:420:43: note: place parentheses around the '&&' expression to
      silence this warning
        if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) {
                                 ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
4b9b3361

Ответ 1

Естественная тенденция состоит в том, чтобы прочитать ее слева направо и легко забыть о приоритете оператора. Тем не менее, это просто предупреждение, и если вы знаете, что делаете, и ваш собственный стиль позволяет это, не стесняйтесь его подавлять.

Ответ 2

Я предполагаю, потому что это просто немного неясно, если только читатель не очень хорошо разбирается в правилах C правил для операторов.

Ваше выражение выглядит следующим образом:

if (A && B || C && D)

и поскольку && имеет более высокую точность, чем ||, это означает

if ((A && B) || (C && D))

который я предполагаю, это то, что вы имеете в виду, но это не очень понятно при чтении.