是吗?:表达式并不总是被评估?

时间:2013-09-16 07:11:07

标签: c++ c expression ternary-operator evaluation

在Lisp中,可以评估任何表达式。 C ++采用的概念:“表达​​式”,“价值”,“评估”。

如果您不知道“表达式”,“值”和“评估”之间的关系,请参阅C ++标准5.1。

我知道?:表达式与+表达式相同。

任何表达式都必须能够被评估并给出一个值。但是?:表达似乎并非总是如此。

void f1() {}
void f2() {}

void test(bool b)
{
    b ? f1() : f2(); // OK. What's the value of this expression?
}

任何表达式都应该有一个值; b ? f1() : f2();是一个表达;它的价值是什么?

有任何解释吗?

更新和我自己的回答:

摘自C ++标准5.1:

  

表达式可能会导致值,并可能导致副作用。

5 个答案:

答案 0 :(得分:5)

表达式b ? f1() : f2()的值为f1()f2(),具体取决于b的值。在您的情况下,两个函数都返回void,因此表达式的值是 nothing

答案 1 :(得分:2)

表达式可以具有值。并非所有表达都有 一个值,就像并非所有表达都有副作用一样。一个 表达式确实有类型; void类型的表达式 没有值(因为void的值集是 空)。

cond ? expr1 : expr2形式的表达式中,类型 根据{{​​1}}和expr1的类型确定。如果 expr2expr1都是expr2,然后是void的类型 条件表达式是void,它没有值。

答案 2 :(得分:1)

true ? f1() : f2()的值为void。从您编辑的部分,您的主要问题是是否可以将void类型视为表达式,答案是肯定的。

  

C ++11§3.9.1基本类型第9节

     

void类型有一组空值。 void类型是不完整的类型,无法完成。它用作不返回值的函数的返回类型。任何表达式都可以显式转换为cv void类型(5.4)。 void类型的表达式只能用作表达式语句(6.2),作为逗号表达式的操作数   (5.18),作为?: (5.16)的第二个或第三个操作数,作为typeid的操作数,或作为返回语句中的表达式(6.6.3)对于返回类型为void的函数。

将Lisp的概念与C ++进行比较没有多大意义。您最多可以将C ++的概念与其他C族语言(如C,Objective C,Java等)进行比较.Lisp就像C系列语言中“语言池”的另一端。

答案 3 :(得分:0)

值为f1()。但是,我不想得到关于它与operator+之间关系的内容。

答案 4 :(得分:0)

三元运算符评估表达式 - 在这种情况下,它意味着true被评估为true,然后评估f1(),这不会做任何事情(表达式计算为void)。

我认为这是我们在语言中void的原因之一。

有关详细信息,请参阅此article