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

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

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

“+”操作符的使用技巧

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

這篇寫個(gè)平時(shí)易被忽略的小知識(shí)點(diǎn),一元 + 操作符的使用技巧。

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

不過若是操作數(shù)為整數(shù)或無作用域枚舉類型,一元 + 操作符會(huì)執(zhí)行 Integral promotion,此時(shí)會(huì)發(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++ 標(biāo)準(zhǔn)不支持 std::to_underlying,你可能得使用以下語句來達(dá)到同樣目的:

static_cast>(enum_val_b);

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

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

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

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

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

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

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

如果沒有 +,那 fp 只是一個(gè) closure 類型,斷言出錯(cuò)。

另一個(gè)用法是在 Concepts 中,比如你想判斷某類型當(dāng)中是否存在某變量,可能會(huì)這樣寫:

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

structS{
intnum;
};

//false
static_assert(HasValue);

沒能達(dá)到預(yù)期是因?yàn)?T::num 是個(gè) 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){};
};

約束必須是表達(dá)式,是以無法只寫類型。更簡(jiǎn)單的話可以這樣寫:

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

因?yàn)樽栽鲞\(yùn)算符也可以構(gòu)成表達(dá)式,那么最簡(jiǎn)單的做法就是采用一元 + 操作符。

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

那么有沒有辦法可以禁止 Integral promotion 呢?Concepts 便有此妙用。看下面這個(gè)例子:

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

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

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73651
  • Type
    +關(guān)注

    關(guān)注

    1

    文章

    137

    瀏覽量

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

    關(guān)注

    0

    文章

    21

    瀏覽量

    9042

原文標(biāo)題:"+" 的幾個(gè)使用小技巧,你了解嗎

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    MATLAB操作符和特殊字符

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

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

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

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

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

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

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

    C語言編程二進(jìn)制位操作符

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

    淺析Linux中命令鏈接操作符的十個(gè)最佳實(shí)例

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

    如何快速入門運(yùn)維?了解Linux中的10個(gè)命令鏈接操作符

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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