Почему Кланг предупреждает: `` && 'внутри' || '`?
Я понимаю, что круглые скобки не имеют значения, так есть ли какая-либо причина (кроме как "улучшить" ясность кода), что Кланг предупреждает об этом как о стандартном? Я предпочитаю не добавлять круглые скобки, поскольку мне не нравится добавлять код для кодов.
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) {
~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Ответы
Ответ 1
Естественная тенденция состоит в том, чтобы прочитать ее слева направо и легко забыть о приоритете оператора. Тем не менее, это просто предупреждение, и если вы знаете, что делаете, и ваш собственный стиль позволяет это, не стесняйтесь его подавлять.
Ответ 2
Я предполагаю, потому что это просто немного неясно, если только читатель не очень хорошо разбирается в правилах C правил для операторов.
Ваше выражение выглядит следующим образом:
if (A && B || C && D)
и поскольку &&
имеет более высокую точность, чем ||
, это означает
if ((A && B) || (C && D))
который я предполагаю, это то, что вы имеете в виду, но это не очень понятно при чтении.