2016-08-26 1 views
-3

en C++, il n'existe pas d'instruction d'affectation ou d'instruction d'appel de fonction.Fonction Appel = expression-instruction ... même fonctions de type void?

Une affectation est une expression; un appel de fonction est une expression; cela vient directement de Bjarne Stroustrup dans son livre "Le langage de programmation C++". Je connais une expression qui calcule une valeur, ce qui me demande si cela s'applique aux fonctions vides, puisqu'elles ne renvoient pas de valeur.

Je voudrais savoir si les fonctions avec un type de retour void comptent toujours comme expressions, et si oui, pourquoi?

+2

Je suis allé de l'avant et réduit le bavardage indépendant de votre question, et structuré les choses un peu. –

+1

Norme C++: * 1 Une expression est une séquence d'opérateurs et d'opérandes qui spécifie le calcul d'une valeur ** ou ** désignant un objet ou une fonction, ** ou ** générant des effets secondaires, ** ou ** qui effectue une combinaison de ceux-ci * (je souligne par moi) notez qu'une expression ne calcule pas nécessairement une valeur; certaines expressions font, cependant. –

+0

Copie possible de [Explication de la différence entre une instruction et une expression en C++] (http://stackoverflow.com/questions/27600153/explaining-the-difference-between-a-statement-and-an-expression-in- c) –

Répondre

1

Les fonctions Yes ne renvoyant aucune valeur (déclarées comme renvoyant void) sont toujours considérées comme des expressions lorsque vous les appelez. Cela limite cependant leur utilisation dans d'autres expressions, par exemple de tels appels ne peuvent pas être de chaque côté d'une affectation.

Comme pour "pourquoi"? Eh bien, un appel de fonction est un appel de fonction est un appel de fonction. L'ajout de règles spéciales pour les fonctions qui ne renvoient pas de valeur rendrait la conception du langage beaucoup plus compliquée. C++ a déjà assez de règles spéciales et d'exceptions.

1

C++14 standard:

§5 expressions:

1 Une expression est une séquence d'opérateurs et d'opérandes spécifiant un calcul. Une expression peut résultat une valeur et peut causer des effets secondaires

Ainsi, le but/la portée d'une expression « principale » est de spécifier un calcul, ne pas calculer une valeur. Certains calculs peuvent entraîner une valeur et certains peuvent avoir des effets secondaires. En plus de cela (ou en fait tout d'abord), "expressions" et "instructions" sont utilisées pour définir la grammaire de C et C++. Il serait syntaxiquement impossible de faire des fonctions qui ne renvoient pas une valeur et non une "expression". Et ajouter cette distinction à un niveau sémantique serait une complication inutile.

+0

Wow. Le manuel de référence que j'ai est obsolète et seulement environ 50 pages. Ce PDF est comme un roman de Stephen King et semble faire tout son possible pour compliquer inutilement tout, plutôt que d'expliquer les concepts d'une manière claire. –

+0

@j_burks que pdf n'est pas un manuel. C'est la norme officielle C++. Ce n'est pas destiné à expliquer les choses aux novices. C'est le document qui définit de manière formelle, complète et non ambiguë ce qu'est le C++. C'est la référence sur laquelle les compilateurs C++ et les bibliothèques standard sont basées. – bolov

0

Oui, void l'appel de fonction est également une expression. La définition dans la norme C++ dit:

Une expression est une séquence d'opérateurs et opérandes qui spécifie un calcul . Une expression peut entraîner dans une valeur et peut provoquer côté effets.

Un appel de fonction est une expression postfixe suivie entre parenthèses contenant un éventuellement vide, séparant par des virgules d'expressions qui constituent les arguments de la fonction.

également dans MSDN C++ Langage:

A postfix expression suivie par l'opérateur d'appel de fonction,(), spécifie un appel de fonction .

0

Fonction Appel = expression-instruction ... fonctions paires de type void?

pas. Mais c'est parce qu'un appel de fonction est la suivante:

do_stuff() 

et qui est un expression_opt. C'est une expression, pas une déclaration. Vous pouvez utiliser cette expression dans les expressions composées, mais ce n'est pas une déclaration par logique de langage.

Vous pouvez convertir rapidement que expression_opt à un expression-statement en lui donnant un point-virgule:

do_stuff(); 

est maintenant une déclaration complète.

La différence devient clair si vous pensez à quelque chose comme

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

do_stuff() et good_thing() sont des expressions qui peuvent/seront évalués. Les points-virgules après () rompraient cette clause if.

+0

Mais si do_stuff() ou good_thing() ont un type de retour de void, cela ne compilera même pas. Je pensais avoir compris ce qu'est une déclaration d'expression en la séparant des autres déclarations (comme la déclaration). Par exemple, vous ne pouvez pas affecter une déclaration à une lvalue, comme int x = int y = 5; Mais même cela ne le fait pas pour une explication.C'est pourquoi j'ai été si confus à propos des expressions qui n'évaluent pas à une valeur, parce que pendant des années c'est ce que je croyais être une "expression": une opération qui renvoie une seule valeur. Maintenant, je dois "désapprendre" ce que j'ai appris. –