不断收到警告“建议在 '||' 内的 '&&' 周围使用括号 对于C程序

Che*_*pes 0 c compiler-warnings parentheses

 printf(" 1|        %d       |         %d         |       %d    |   %d  |     %d\n", 
    ((coffee_strength == 'm' || coffee_strength == 'M') && 
     (coffee1_type == 'l' || coffee1_type == 'L') || 
     (coffee_strength == 'r' || coffee_strength == 'R') && 
     (coffee1_type == 'b' || coffee1_type == 'B')), 
    ((coffee_maker == 'r' || coffee_maker == 'R') && 
     (coffee1_grindSize == 'c' || coffee1_grindSize == 'C') ||
     (coffee_maker == 'C' || coffee_maker == 'c') &&
     (coffee1_grindSize == 'f' || coffee1_grindSize == 'F')),
    ((coffee_servings >= 1) && (coffee_servings <= 4) &&
     (coffee1_weight >= 0) && (coffee1_weight <= 250) ||
     ((coffee_servings >= 1) && (coffee_servings <= 9) &&
      (coffee1_weight == 500)) || 
     ((coffee_servings >= 10) && (coffee1_weight == 1000))),
    (((coffee_cream == 'y' || coffee_cream == 'Y') &&
      (coffee1_cream == 'y' || coffee1_cream == 'Y') ||
      (coffee_cream == 'n' || coffee_cream == 'N') &&
      (coffee1_cream == 'n' || coffee1_cream == 'N'))),
    ((coffee1_temp >= 60.0) && (coffee1_temp <= 69.9) &&
     (coffee_maker == 'r' || coffee_maker == 'R') || 
     ((coffee1_temp >= 70.0) && (coffee_maker == 'c' ||  coffee_maker == 'C'))));
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试编译的代码。每次运行它时,我仍然会遇到与括号放置相关的问题。我已经多次编辑代码来尝试解决此问题,但问题仍然存在。有人对我应该做什么有什么建议吗?

Who*_*aig 5

运算符的&&优先级高于运算符||。因此,虽然合法,但编译器会告诉您执行此操作的代码:

a && b || c && d
Run Code Online (Sandbox Code Playgroud)

可能没有按照您的意愿行事。编译器会将其视为

(a && b) || (c && d)
Run Code Online (Sandbox Code Playgroud)

但据我们所知,你的意图是其他许多事情中的任何一件。

也许是这样:

a && (b || (c && d))
Run Code Online (Sandbox Code Playgroud)

或这个:

((a && b) || c) && d
Run Code Online (Sandbox Code Playgroud)

或者也许......这个:

a && (b || c) && d
Run Code Online (Sandbox Code Playgroud)

ETC。

它会产生影响,并且像这样的错误很常见,因此尽管您的代码可以编译,但当适当要求这样做时,它会发出警告(并且总是适当地要求)。不是因为它是错误的,而是因为你的意图不够明确,警告猴子被制服了(在这种情况下,在大多数情况下,这是一件好事)为了确保你得到你所期望的结果,编译器会询问您通过括号澄清您的表达。如果您使用 gcc 或 clang,-Wall 中包含的 -Wlogic-op-括号很可能会告诉您这一点。

从表面上看,您已经开始尝试解决这个问题,但您错过了几个实例。例如:

((coffee_servings >= 1) && (coffee_servings <= 4) &&
 (coffee1_weight >= 0) && (coffee1_weight <= 250) || // <== here
 ((coffee_servings >= 1) && (coffee_servings <= 9) &&
 (coffee1_weight == 500)) || 
 ((coffee_servings >= 10) && (coffee1_weight == 1000)))
Run Code Online (Sandbox Code Playgroud)

下面还有其他一些,我留给您去查找(一旦您开始嵌套括号并意识到a && b || c弹出了多少个位置,它们就非常明显)。

(((coffee_cream == 'y' || coffee_cream == 'Y') &&
  (coffee1_cream == 'y' || coffee1_cream == 'Y') ||
  (coffee_cream == 'n' || coffee_cream == 'N') &&
  (coffee1_cream == 'n' || coffee1_cream == 'N'))),
Run Code Online (Sandbox Code Playgroud)

和这里:

((coffee1_temp >= 60.0) && (coffee1_temp <= 69.9) &&
 (coffee_maker == 'r' || coffee_maker == 'R') || // <== here
 ((coffee1_temp >= 70.0) && (coffee_maker == 'c' || coffee_maker == 'C')))
Run Code Online (Sandbox Code Playgroud)