2016-08-26 21 views
-3

,不存在赋值语句或函数调用语句。函数调用=表达式语句......甚至类型void的函数?在C++中使用

赋值是一个表达式;函数调用是一个表达式;这是直接来自Bjarne Stroustrup在他的书“The C++ Programming Language”

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

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

+2

我继续前进,减少了无关的喋喋不休从你的问题,并有点结构的东西。 –

+1

C++标准:* 1表达式是一系列运算符和操作数,用于指定计算值,指定对象或函数的**或**,生成副作用的**或**,**或**执行它们的组合*(强调我)注意到一个表达式不一定计算一个值;但是,某些表达式可以。 –

+0

[在C++中解释语句和表达式之间的区别]可能的重复(http://stackoverflow.com/questions/27600153/explaining-the-difference-between-a-statement-and-an-expression-in- c) –

回答

1

返回无值的函数(声明为返回void)在您调用它们时仍算作表达式。这限制了它们在其他表达式中的使用,例如,这种调用不能在任务的任何一方。

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

1

C++14 standard:

§5表达式:

1表达式是运营商和操作数的序列,可指定 计算。表达可以结果中的值,并且可以原因侧 效果

所以表达式的“主”目的/范围是指定的计算,不计算的值。一些计算可能会导致一个值,一些可能会有副作用。

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

+0

哇。我拥有的参考手册已过时,只有大约50页。这个PDF就像一部Stephen King的小说,似乎不顾一切地使其复杂化,而不是以一种清晰的方式解释概念。 –

+0

@j_burks pdf不是手册。这是官方的C++标准。这并不是要向新手解释事情。它是以正式,完整和明确的方式定义C++的文档。这是C++编译器和标准库所基于的参考。 – bolov

0

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

表达式是运营商和操作数的序列,可指定一个 计算。一个表达式可能导致的值和可能导致方 的影响。

函数调用是后缀表达随后含有 构成函数的自变量的表达式的可能是空的,逗号分隔的列表括号 。

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

后缀表达式接着函数调用操作者,(), 指定函数调用

0

函数调用=表达式语句...甚至类型void的函数?

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

do_stuff() 

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

您可以快速转换是expression_optexpression-statement给它一个分号:

do_stuff(); 

现在是一个完整的声明。

如果你想一想像

if(good_thing() || do_stuff()) 
{ 
    .... 
} 

do_stuff()good_thing()的区别变得清晰是表达式,它可以/将进行评估。 ()后面的分号会破坏if子句。

+0

但是,如果do_stuff()或good_thing()具有返回类型的void,那甚至不会编译。我以为我已经通过将它与其他声明(如声明)分开来计算出表达式声明的内容。例如,你不能将一个声明语句分配给一个左值,如int x = int y = 5;但即使这样做也不能解释。这就是为什么我对表达式没有对值进行评估时如此困惑,因为多年来,这是我认为的一个“表达式”:一个返回单一值的操作。现在我必须“忘掉”我学到的东西。 –