2016-08-26 35 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;但即使這樣做也不能解釋。這就是爲什麼我對錶達式沒有對值進行評估時如此困惑,因爲多年來,這是我認爲的一個「表達式」:一個返回單一值的操作。現在我必須「忘掉」我學到的東西。 –