簡體   English   中英

為什么編譯器不會在以加法運算符開頭的行中停止?

[英]Why does compiler not balk at a line beginning with an addition operator?

我只是做了一些重構,並為自己創建了一個錯誤:

int i = 2;
    + 7;
    + 4;

這是簡化的; 第1行和第2行末尾的附加分號並不是那么明顯 - 至少對我來說:)。

我無法弄清楚為什么編譯器沒有抓住它。 在C ++中是否有一些有效的操作,它開始使用加法運算符?

沒有添加到添加運算符的東西只是意味着正+2; 只是意味着(+2); 這就像只有一條線i; 或類似的。 沒有什么“錯誤”,但也沒有任何事情發生。 如果你使用帶有-Wall指定的gcc在* nix下編譯你將得到錯誤warning: statement has no effect通常很好知道,因為它通常是一個標志你想要做某事的聲明其實不是做什么的它應該是。

這是一個完全有效的代碼,您使用的是一元+運算符 ,結果是操作數的值,它還對操作數執行整數提升。

在這種情況下發出警告會有所幫助,例如使用-Wall -Wextra gcc和clang會給你一個這樣的警告:

警告:表達式結果未使用[-Wunused-value]

 + 7; ^ ~ 

我們可以使用/ Wall在Visual Studio中獲得相同的警告:

警告C4555:表達無效; 具有副作用的預期表達

這是覆蓋在C ++草案標准節5.3.1 元運算符它說:

一元+運算符的操作數應具有算術,無范圍枚舉或指針類型,結果是參數的值。 對整數或枚舉操作數執行整體提升。 結果的類型是提升的操作數的類型。

cppreference有以下說法:

內置的一元加運算符返回其操作數的值。 它不是無操作的唯一情況是當操作數具有整數類型或未整合的枚舉類型時,它由整數提升改變,例如,它將char轉換為int或者如果操作數受到左值到右值的影響,數組到指針或函數到指針的轉換。

+ 7; 是一個表達式語句 ,它由一個表達式后跟一個分號組成。

計算表達式,並丟棄結果。 通常這樣做是因為表達式具有副作用(例如賦值或I / O語句)。 表達式沒有副作用的表達式語句是合法的但沒用。

如果你很好地問他們,一些編譯器可能會警告它。

正如其他人所指出的那樣, +是一元加運算,其存在是為了與一元對稱-運營商。 它產生其操作數的值(在適當的情況下執行整數提升后)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM