0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

“+”操作符的使用技巧

CPP開發(fā)者 ? 來源: CppMore ? 2023-12-28 13:27 ? 次閱讀

這篇寫個平時易被忽略的小知識點,一元 + 操作符的使用技巧。

一般二元 + 操作符用得較多,只有一個操作數(shù)時,沒人會多此一舉地把 1 寫成 +1。

不過若是操作數(shù)為整數(shù)或無作用域枚舉類型,一元 + 操作符會執(zhí)行 Integral promotion,此時會發(fā)生隱式轉(zhuǎn)換。例如:

//unscopedenumeration
enumEnum:unsignedint{
enum_val_a,
enum_val_b,
enum_val_c
};

intmain(){

boolb=true;
+b;//int

+enum_val_b;//unsignedint

charc='c';
+c;//int

unsignedshorts=10;
+s;//int

intarray[10];
+array;//int*
}

若是你使用的 C++ 標準不支持 std::to_underlying,你可能得使用以下語句來達到同樣目的:

static_cast>(enum_val_b);

這種寫法太過繁瑣,而以一元 + 操作符則可以非常簡單地完成這種轉(zhuǎn)換,當然前提須是 underlying 類型固定。

對于一些奇怪的類型,比如 std::uint8_t,它的類型是什么呢?顧名思義應(yīng)該是 8-bit 的 Unsigned integer,然而實際上它是 unsigned char 的 typedef。那么在輸出的時候就會遇到一些問題:

std::uint8_tu=0x45;
std::cout<

最終輸出將是 E,并不是一個無符號整數(shù),你需要使用強制轉(zhuǎn)換才能得到想要的輸出。而借助一元 + 操作符,則可以非常簡單地達到預(yù)期。

std::uint8_tu=0x45;
std::cout<

另外,一元 + 操作符也支持指針類型的操作數(shù),所以它也可以隱式地把 Lambda 轉(zhuǎn)換為函數(shù)指針。例如:

autofp=+[]{};
static_assert(std::is_same_v);

如果沒有 +,那 fp 只是一個 closure 類型,斷言出錯。

另一個用法是在 Concepts 中,比如你想判斷某類型當中是否存在某變量,可能會這樣寫:

template
conceptHasValue=requires(Tt){
{T::num}->std::integral;
};

structS{
intnum;
};

//false
static_assert(HasValue);

沒能達到預(yù)期是因為 T::num 是個 value,而非 type。一種做法是采用 std::is_integral,

template
conceptHasValue=requires(Tt){
std::is_integral_v;
};

//true
static_assert(HasValue);

這種做法就將 T::num 變成了 type,同理也可以這樣做:

template
conceptHasValue=requires(Tt){
decltype(T::num){};
};

約束必須是表達式,是以無法只寫類型。更簡單的話可以這樣寫:

template
conceptHasValue=requires(Tt){
T::num++;
};

因為自增運算符也可以構(gòu)成表達式,那么最簡單的做法就是采用一元 + 操作符。

template
conceptHasValue=requires(Tt){
+T::num;
};

那么有沒有辦法可以禁止 Integral promotion 呢?Concepts 便有此妙用??聪旅孢@個例子:

uint8_tbad_foo(uint8_ta,uint8_tb){
returna+b;//implicitconversion
}

std::same_asauto
good_foo(uint8_ta,uint8_tb){
returna+b;//Compileerror!
}

對于 bad_foo(),return a + b 在不經(jīng)意間發(fā)生了 Integral promotion,它其實相當于return uint8_t((int)a + (int)b)。

這種隱式轉(zhuǎn)換的結(jié)果可能并不如人所愿,Concepts 相當于給返回值聲明了 explict,從而避免錯誤。當你明確不需要返回值隱式轉(zhuǎn)換的時候,可以借助這種方式。

活用這些小技巧,不僅可以簡化代碼,還能增加程序安全性。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73301
  • Type
    +關(guān)注

    關(guān)注

    1

    文章

    133

    瀏覽量

    22570
  • 操作符
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    9021

原文標題:"+" 的幾個使用小技巧,你了解嗎

文章出處:【微信號:CPP開發(fā)者,微信公眾號:CPP開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Linux命令中“!”操作符的用法

    Linux中的'!'符號或操作符可以用作邏輯否定運算,也可以用于在歷史記錄中獲取命令并進行修改或運行以前執(zhí)行過的命令。
    發(fā)表于 07-05 10:07 ?1375次閱讀

    MATLAB操作符和特殊字符

    MATLAB操作符和特殊字符* 矩陣乘法 .* 數(shù)組乘法 ^ 矩陣冪 .^ 數(shù)組冪 \ 左除或反斜杠 / 右除或斜杠 ./ 數(shù)組除 Kron Kronecker張量積 .. 父目錄 … 繼續(xù)
    發(fā)表于 09-22 16:05

    C語言,操作符優(yōu)先級順序。

    `下午,在圖書館看了會《C陷阱與缺陷》這本書,看到操作符優(yōu)先級部分,想著這部分很重要,我就記錄下來,方便自己以后查看。先上張圖片吧。書中做的總結(jié),我也敘述一下:優(yōu)先級最高的是非操作符部分
    發(fā)表于 01-16 17:30

    操作符的相關(guān)資料分享

    嵌入式C語言入門——操作符
    發(fā)表于 12-15 06:50

    C++的CIN和COUT操作符的方法

    本內(nèi)容詳細提供了C++的CIN和COUT操作符的方法,主要代碼如下: #include using namespace std; const int MAX_EDGE = 100; const int MAX_NODE = 100;
    發(fā)表于 08-26 10:29 ?1377次閱讀

    C語言編程二進制位操作符

    C語言編程二進制位操作符
    發(fā)表于 03-30 14:09 ?6次下載

    淺析Linux中命令鏈接操作符的十個最佳實例

    Linux命令中鏈接的意思是,通過操作符的行為將幾個命令組合執(zhí)行。
    的頭像 發(fā)表于 08-10 15:51 ?2826次閱讀

    如何快速入門運維?了解Linux中的10個命令鏈接操作符

    Linux命令中鏈接的意思是,通過操作符的行為將幾個命令組合執(zhí)行。Linux中的鏈接命令,有些像你在shell中寫短小的shell腳本,并直接在終端中執(zhí)行。鏈接使得自動處理變得更方便。不僅如此,一個無人看管的機器在鏈接操作符的幫助下能夠十分有條理地運行。
    的頭像 發(fā)表于 10-03 19:33 ?2984次閱讀

    Linux中命令鏈接操作符的實際應(yīng)用

    Linux命令中的鏈接的意思是,通過操作符的行為將幾個命令組合執(zhí)行。Linux中的鏈接命令,有些像你在shell中寫短小的shell腳本,并直接在終端中執(zhí)行。鏈接使得自動處理變得更方便。
    發(fā)表于 05-06 17:44 ?803次閱讀

    使用51單片機內(nèi)核的匯編操作符筆記

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機內(nèi)核的匯編操作符筆記。
    發(fā)表于 07-19 17:38 ?1次下載
    使用51單片機內(nèi)核的匯編<b class='flag-5'>操作符</b>筆記

    C語言的sizeof操作符基礎(chǔ)和經(jīng)典問題

    在C語言中,sizeof是一個操作符(operator),而不是函數(shù)!其用于判斷數(shù)據(jù)類型或者表達式長度(所占的內(nèi)存字節(jié)數(shù))。其有兩種表達形式:
    的頭像 發(fā)表于 04-04 17:39 ?2586次閱讀
    C語言的sizeof<b class='flag-5'>操作符</b>基礎(chǔ)和經(jīng)典問題

    C++:詳談取地址操作符重載

    取址操作符重載函數(shù)返回值為該類型的指針,無參數(shù)。
    的頭像 發(fā)表于 06-29 11:59 ?3381次閱讀
    C++:詳談取地址<b class='flag-5'>操作符</b>重載

    C++之操作符重載學習的總結(jié)

    操作符重載是c++的強大特性之一;操作符重載的本質(zhì)是通過函數(shù)擴展操作符的功能;operator 關(guān)鍵字是實現(xiàn)操作符重載的關(guān)鍵。
    的頭像 發(fā)表于 12-24 16:36 ?594次閱讀

    Verilog基礎(chǔ):幾個常用的按位操作符

    操作符是對二進制位進行操作的運算。
    的頭像 發(fā)表于 11-09 10:57 ?1130次閱讀

    Verilog基礎(chǔ):介紹幾個常用的按位操作符

    操作符是對二進制位進行操作的運算。以下是一些常用的位操作符
    的頭像 發(fā)表于 11-09 10:59 ?1272次閱讀