函数Call = expression-statement ...甚至函数类型为void?

时间:2016-08-26 08:54:15

标签: c++ function void

在C ++中,没有赋值语句或函数调用语句。

作业是一种表达;函数调用是一个表达式;这是直接来自Bjarne Stroustrup的书“编程语言”。

我知道一个表达式计算一个值,让我想知道这是否适用于void函数,因为它们不返回值。

我想知道返回类型 void 的函数是否仍然算作表达式,如果是,为什么?

4 个答案:

答案 0 :(得分:1)

是函数返回没有值(声明为返回void)在调用它们时仍然计为表达式。这限制了它们在其他表达式中的使用,例如,这样的调用不能在赋值的任何一方。

至于"为什么"?好吧,函数调用是函数调用,是函数调用。为不返回值的函数添加特殊规则会使语言设计变得更加复杂。 C ++已经有足够的特殊规则和例外。

答案 1 :(得分:1)

C++14 standard:

  

§5表达式:

     

1表达式是指定的运算符和操作数序列   计算。表达式可以会产生一个值,可以会产生一个值   效果

因此,表达式的“主要”目的/范围是指定计算,而不是计算值。某些计算可能会产生一个值,而某些计算可能会产生副作用。

除此之外(或实际上首先),“表达式”和“语句”用于定义C和C ++的语法。在语法上不可能使函数不返回值而不是“表达式”。在语义层面添加这种区别将是不必要的过度复杂化。

答案 2 :(得分:0)

是的,void函数调用也是一个表达式。 C ++标准中的定义说:

  

表达式是一系列指定a的运算符和操作数   计算。表达式可以导致值,可以导致侧   的效果。

     

函数调用后缀表达式,后跟括号   包含一个可能为空的逗号分隔的表达式列表   构成函数的参数。

同样在 MSDN C ++语言参考:

  

后缀表达式,后跟函数调用运算符(),   指定函数调用

答案 3 :(得分:0)

  

Function Call = expression-statement ...甚至类型为void的函数?

没有。但那是因为函数调用是这样的:

do_stuff()

那是expression_opt。它是一种表达,而不是一种陈述。您可以在复合表达式中使用此表达式,但它不是语言逻辑的语句。

您可以通过为其添加分号来快速将expression_opt转换为expression-statement

do_stuff();

现在是一份完整的声明。

如果你想到像

这样的东西,差异就会变得清晰
if(good_thing() || do_stuff())
{
    ....
}

do_stuff()good_thing()是表达式,可以/将被评估。 ()之后的分号会破坏if子句。