字首加一 減一操作符在C C 中的不同語義問題

2021-04-02 19:53:38 字數 1080 閱讀 8353

$ cat -n 1.c

1  int main( int argc, char **argv )

2  $ cat 1.c | gcc -x c -ansi -

: in function `main':

:5: error: invalid lvalue in increment

:6: error: invalid lvalue in increment

:7: error: invalid lvalue in increment

:8: error: invalid lvalue in increment

$ cat 1.c | gcc -x c++ -ansi -

: in function `int main(int, char**)':

:6: error: non-lvalue in increment

:8: error: non-lvalue in increment

$

上面這段**被分別作為 c 和 c++ 兩種**進行編譯,得到了不同的錯誤提示。當作為 c **進行編譯時,第5到第8行**全部出錯。而作為 c++ **編譯時,只有 6、8兩行**被提示錯誤。這裡揭示了乙個事實:c和c++**在一定程度上,區別已經不能再被忽視了。

對於prefix ++/-- 操作符,c++ 標準在 5.3.2 節 unary expression -> increment and decrement 中進行了詳細的解釋。對於 prefix ++/-- 操作符來說,必須滿足如下條件:

1、運算元是數學型別或指向經過完整定義的型別物件的指標。後者確定了對指標進行 ++/-- 時實際跳過的位元組數。

2、如果運算元型別為bool,則運算元被設為true;否則,運算元被遞增1。表示式的值就是新的運算元的值。

3、prefix 表示式的結果是 lvalue。

最關鍵的就是上面的第三點,因為 c 和 c++ 在另外兩點中語義基本差別不大,但是在第三點中具有顯著的差別。c++98 中規定,賦值操作符、自反賦值和字首遞增操作符的結果是 lvalue,而 c99 中將賦值操作符的結果設定為非 lvalue,因此導致了第5、7兩行語句在不同環境下編譯時得到的不同結果。

字首加一 減一操作符在C C 中的不同語義問題

cat n 1.c 1 int main int argc,char argv 2 cat 1.c gcc x c ansi in function main 5 error invalid lvalue in increment 6 error invalid lvalue in incremen...

關於C C 中的點操作符和箭頭操作符

ps 話說以前竟然一直沒有關注到這個問題啊。不應該啊。今天查了點資料,加上自己寫code的體會,說下一下,作為記錄吧。先概括一下 點操作符 用來引用普通物件。箭頭操作符 用來引用指標物件。舉例子說明一下 比如,我有乙個物件darkray。那麼我可以通過 來呼叫darkray類中中的成員變數。但是如果...

C C 中「 」操作符和「後 」操作符的優先順序

假設有如下的定義 char carr char cp carr 那麼表示式 cp 的右值是什麼呢?這個表示式在陣列遍歷的程式中非常常見,但我對於這個表示式的理解有些偏差,我一直認為它和下面的表示式是等價的。cp cp 即先對cp進行解引用操作,然後使cp指向陣列的下乙個位置。雖然說最終的結果是一樣的...