在C或C ++中,在!(variable)
中使用(!variable)
和if-statement
之间是否有确定的区别,例如:
if (!(variable)) { .. // do something }
或
if (!variable && !(variable2)) { .. // do something }
这样一个版本提供的结果与另一个版本不同?
答案 0 :(得分:8)
关于操作的顺序。使用!(变量)将评估括号内的所有条件然后执行! (或NOT)确定是否输入if语句where-as(!变量将特别对变量本身进行NOT。
所以在这种情况下:
!(true && false) = true
!(true && true) = false
(!true && !false) = false
(!true && true) = false
!(true && !false) = false
......等等
希望这会有所帮助。
答案 1 :(得分:6)
唯一可以产生影响的方法是,如果变量是表达式,那么它是运算符优先级的问题。否则,&&
的优先级低于!
答案 2 :(得分:4)
之间没有区别
!(variable)
和
(!variable)
但是如果您使用具有不同优先级的运算符,则会有所不同。例如,如果你写
!(varible1 && variable2)
与
不同!varible1 && variable2
因为在第一种情况下NOT将适用于整个操作,而在第二种情况下仅适用于varible1
。
可能是你的评估有问题,C有懒惰的评估,所以当执行检测到布尔评估有结果时,它不会尝试其他值。所以,现在考虑使用函数代替变量。
int foo() { printf("foo\n"); return 1; }
int bar() { printf("bar\n"); return 0; }
如果你写
if (foo() && bar()) { ... }
你会得到
foo
bar
但如果你写
if (bar() && foo()) { ... }
你只会得到
bar
因为评估结果为假,与foo
答案 3 :(得分:1)
不,在你的例子中第一个(虽然parens是不平衡的:))行为与没有括号时的行为完全相同,第二个行为相同。你甚至可以这样做
if ((!((((variable)))))) { ... }
但不要:)
答案 4 :(得分:1)
他们永远不应该评价不同的东西。以这种方式使用的括号实际上是用于分组操作,但在这种情况下,您不是对任何操作进行分组,而只是对表达式本身进行分组。
所以!(x)
只是一种迂腐的写作方式!x
现在,如果您在括号内进行了操作,那就是差异开始的地方。