2013-06-23 64 views
0

1)他們爲什麼叫「主」?按照評估的順序,他們是第一個?C++主要表達式 - 它是否是主要表達式?

2)C++ 03標準定義了第5章(注1)中的表達式:「一個表達式是一個指定計算的操作符和操作數序列。」

然後,5.1 「基本表達式」 定義主表達式列表:

(1)基本表達式:

字面

(表達式)

id-expression

我的m AIN的問題是在連接點THRID:

(表達式)

所以,根據標準,用方括號括的每一個表達式是伯表達式和它們首先計算。它看起來合乎邏輯,並給出了C++表達式中括號行爲的精確解釋(優先級)。

所以這menas使得例如

(可變+ 10)

是伯表達。

VAR =(變量+ 10)* 3

和根據我的理論,它看起來邏輯,但來自其他來源的我知道

(可變+ 10)

不是主表達,但爲什麼?我不理解,然而,標準定義了

(表達式)

作爲主要表達。

請幫助我,因爲我不能。非常感謝,對不起我的英文不好。 嗨。

+1

那些說「(變量+ 10)」不是主要表達式的那些「其他來源」是什麼?而「主要表達」並不意味着它首先得到評估。 – jrok

+0

首先,我在另一個論壇上問了我的問題。它沒有先評估?那爲什麼他們被稱爲主要?感謝您的幫助。 – user2148758

+1

我沒有關於爲什麼他們被稱爲主要的授權答案。據我的理解,這是因爲它們是大型表達式的某種構件。關於評估順序,可以考慮:int x =(1 + 5) - ++ i;'++ i'也可以首先評估,即使它是一元表達式而不是主要表達式。無論誰說(變量+10)不是主要表達式都是錯誤的。 – jrok

回答

6

C++表達式可能很複雜,也就是說它們可以由嵌套表達式組成,通過運算符的組合使用,而這些嵌套的表達式可能會變得複雜。

如果將複雜表達式分解爲更小的單位,則在某些時候,您將剩下的單位是原子的,因爲它們不能進一步分解。這些是主要表現形式;它們包括標識符,文字,關鍵字this和lambda表達式。

但是,確實有一個C++標準定義爲主要的非原子構造:括在圓括號(又名括號)中的表達式。因此,您給出的(variable + 10)示例是一個主表達式(子表達式variable(它是一個標識符)和10(它是一個文字))也是如此。

我相信標準將它們列爲主要表達式,因爲它們在評估順序時扮演着真正的原子表達式的角色:括號內的任何內容都必須在返回的表達式的值進入評估之前進行評估和其他表達式:在(5+10)*a中,必須評估5+10的值,然後才能進入*a的評估。 [請注意,這並不意味着在評估表達式a之前評估5+10。這隻意味着5+10必須在乘法本身進行評估之前進行評估。]

因此,在這種意義上,括號內的子表達式就好像它們是原子的。

我想這就是爲什麼標準不使用術語「原子表達式」這個概念。它們的行爲好像是原子的,但至少括號內的變種實際上並不是原子的。對我來說,「小學」似乎是一個很好的選擇。

+0

非常感謝您的回答。唯一不清楚的是:「第5章定義了語法,評估順序和表達式的含義」(標準)首先是主要表達式(5.1),後綴運算符(5.2)等...主要表達式首先評估或不是如何jrok說的? – user2148758

+1

@ user2148758標準首先定義它們是因爲它們是複雜表達式的最內層部分,它們在評估順序中優先(但僅在我的答案中解釋)。標準中描述表達式類型的順序很大程度上與它們的優先順序相對應:例如,在'(a + b)* ++ c'中,括號是在乘法之前計算的,因此是前綴運算符'+ +'。 (但是標準並沒有說'括號'(a + b)'是否在'++ c'之前被評估過;這兩個是不同的子表達式的一部分 – jogojapan

+0

謝謝,那麼請讓我來測試一下嗎? (a + b)* ++ c'這是一個複雜的表達式,並且'(a + b)'是主要的。標準沒有定義(所以它是實現定義的)'(a + b)'或'++ c'將首先被計算,但是標準定義:在計算兩個子表達式之後,計算乘法。根據定義,'(a + b)'是主要的,因爲它表現爲主要表現形式,它需要進一步的計算,並且通過'a'和'b'子表達式(當然還有+運算符)來表示。是否這個okey? – user2148758