簡體   English   中英

C++ 運算符順序評估

[英]C++ operator order evaluation

我有代碼,它給了我一個編譯錯誤。 我期望左右運算符順序評估。 'name += ":"' 的結果是字符串,但看起來它首先評估了 ":" + "O"。 我沒有找到任何明確的解釋。

#include <string>

int main()
{
  std::string name("HELL");
  name += ":" + "O";
  std::cout << "Hello, " << name << "!\n";
}

表達式name += ":" + "O"分組name += (":" + "O")

但這將導致編譯錯誤,因為":""0"const char[2]類型,它們會衰減為該表達式中的const char*指針; 並且指針不能相加!

從 C++14 開始,您可以使用用戶定義的文字""s+置於“字符串模式”:

name += ""s + ":" + "O"

盡管從 運算符優先級和結合性方面考慮很方便,但分組規則已硬連線到語言語法

根據operator precedenceoperator+優先級高於operator+= ,那么name += ":" + "O"; 被解釋為name += (":" + "O"); ,而":" + "O"無效,你不能添加兩個指針( ":""O"會衰減為類型為const char*指針)。

您可以添加()來指定優先級,例如(name += ":") + "O"; ,它編譯但請注意,部分+ "O"在這里變得毫無意義。 或者你可能想要(name += ":") += "O"; 正如@Scheff 所建議的,這取決於您的需求。

帶有復合賦值的這個表達式語句

name += ":" + "O";

實際上相當於

name = name + ( ":" + "O" );

在這個子表達式中

( ":" + "O" )

字符串文字被轉換為指向它們的第一個元素的指針。 然而,二元運算符 + 沒有為指針定義。 所以編譯器會報錯。

您可以將原始語句拆分為兩個語句,例如

name += ":";

name += "O";

在這種情況下,將使用為類 std::basic_string 定義的運算符 + ,該類接受類型為const char *的參數。

暫無
暫無

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

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