!(变量)和(!变量)之间的区别

时间:2011-04-28 14:33:33

标签: c++ c if-statement

在C或C ++中,在!(variable)中使用(!variable)if-statement之间是否有确定的区别,例如:

if (!(variable)) { .. // do something }

if (!variable && !(variable2)) { .. // do something }

这样一个版本提供的结果与另一个版本不同?

5 个答案:

答案 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

现在,如果您在括号内进行了操作,那就是差异开始的地方。