使用if或logic执行条件

时间:2010-06-25 04:47:49

标签: c++

当使用对象时,我有时会测试它们的存在 e.g

if(object)
 object->Use();

我可以使用

(object && object->Use());

如果有的话会有什么不同?

6 个答案:

答案 0 :(得分:12)

它们是相同的,假设object->Use()返回在布尔上下文中有效的东西;如果它返回void,编译器会抱怨void返回没有像它应该被忽略的那样,而其他不适合的返回类型会给你类似no match for 'operator&&'

的东西。

答案 1 :(得分:5)

一个巨大的区别是,如果operator&&超载,则两者的功能会大不相同。仅为内置操作员提供短路评估。在运营商超负荷的情况下,双方将按照未指明的顺序进行评估; operator&&在这种情况下也没有定义序列点],结果传递给实际的函数调用。

如果objectobject->Use()的返回类型都是基本类型,那么你没问题。但是如果其中任何一个属于类类型,那么即使object->Use()求值为false,也可能会调用object

答案 2 :(得分:1)

它们实际上是相同的,但第二个并不像你的第一个版本那么明确,它的意图很明显。执行速度也许没有什么不同。

答案 3 :(得分:1)

在功能上它们是相同的,一个不错的编译器应该能够同样优化两者。但是,使用这样的运算符编写表达式而不检查结果是非常奇怪的。也许如果这种风格很常见,它会被认为简洁易读,但事实并非如此 - 现在它只是奇怪。你可能已经习惯了,它可能对你很有意义,但对于那些阅读你的代码的人来说,他们的第一印象将是“这到底是什么?”因此,我建议使用第一个常用版本,如果只是为了避免让你的程序员疯狂。

当我年轻的时候,我想我会发现这很有吸引力。我一直想减少代码行,但后来我意识到当你偏离常规时,从长远来看,当你开始与团队合作时,它会咬你。如果你想用最少的代码行实现zen编程,那么关注逻辑而不是语法。

答案 4 :(得分:1)

我不会这样做。如果你超载了运营商&&指向对象返回的指针类型和对象返回的类类型>使用()所有投注都关闭,没有短路评估。

答案 5 :(得分:1)

是的,你可以。你看,C语言和C ++是两个相当独立的世界的组合,或者领域,如果你愿意的话。有语句领域表达式领域。每个人本身都可以看作是一个单独的子语言,它有自己的基本编程结构实现。

在语句领域,排序由单个语句末尾的;或复合语句末尾的}实现。在表达式领域,排序由,运算符提供。

语句领域中的

分支if语句实现,而在表达式领域,它可以由?:运算符或使用短语实现 - &&||运算符的电路评估属性(假设您的表达式有效,这就是您刚才所做的)。

表达式的领域没有循环,但它有递归可以替换它(虽然需要函数调用,这不可避免地迫使我们切换到语句)。

显然,这些领域的力量远非等同。 C和C ++是由语句支配的语言。但是,通常只能使用表达式语言来实现相当复杂的构造。

您在上面所做的事情确实在表达式语言中实现了等效的分支。请记住,许多人会发现很难在正常的代码中阅读(主要是因为它们再次被语句主导的C和C ++代码使用)。但是在一些特定情况下它常常非常方便,例如模板元编程,例如。