在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

“+”操作符的使用技巧

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

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

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

不過若是操作數為整數或無作用域枚舉類型,一元 + 操作符會執行 Integral promotion,此時會發生隱式轉換。例如:

//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);

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

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

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

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

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

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

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

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

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

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

structS{
intnum;
};

//false
static_assert(HasValue);

沒能達到預期是因為 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++;
};

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

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 在不經意間發生了 Integral promotion,它其實相當于return uint8_t((int)a + (int)b)。

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

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

審核編輯:湯梓紅

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

    關注

    22

    文章

    2116

    瀏覽量

    74525
  • Type
    +關注

    關注

    1

    文章

    139

    瀏覽量

    23128
  • 操作符
    +關注

    關注

    0

    文章

    21

    瀏覽量

    9103

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

文章出處:【微信號:CPP開發者,微信公眾號:CPP開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

    MATLAB操作符和特殊字符

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

    C語言,操作符優先級順序。

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

    操作符的相關資料分享

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

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

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

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

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

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

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

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

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

    Linux中命令鏈接操作符的實際應用

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

    使用51單片機內核的匯編操作符筆記

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

    C語言的sizeof操作符基礎和經典問題

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

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

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

    C++之操作符重載學習的總結

    操作符重載是c++的強大特性之一;操作符重載的本質是通過函數擴展操作符的功能;operator 關鍵字是實現操作符重載的關鍵。
    的頭像 發表于 12-24 16:36 ?780次閱讀

    Verilog基礎:幾個常用的按位操作符

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

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

    操作符是對二進制位進行操作的運算。以下是一些常用的位操作符
    的頭像 發表于 11-09 10:59 ?2215次閱讀
    主站蜘蛛池模板: 这里只有精品视频 | 欧美精品一级 | 成年啪啪网站免费播放看 | 欧美成人免费高清网站 | 国产成人毛片毛片久久网 | 欧美不在线 | 亚洲欧美日韩高清mmm777 | 中国美女乱淫免费看视频 | 亚洲男人a天堂在线2184 | 午夜影院欧美 | 天天爽夜爽免费精品视频 | 丝袜美女被 | h在线网站| 色播基地| 午夜小福利| 亚洲成人免费网站 | 亚洲人成电影院在线观看 | 欧美巨大xxxx做受中文字幕 | 69日本xxⅹxxxxx18| 日本高清色图 | 激情丁香小说 | 黄网站免费大全 | 亚洲午夜精品久久久久久抢 | 一级国产特黄aa大片 | 狠狠干网 | 四虎在线永久 | www.99在线| 中文字幕在线观看一区 | 日本黄色片在线观看 | 久久久中文| 国产手机看片 | 色资源在线观看 | 播放毛片 | 天堂中文在线免费观看 | 特一级黄色毛片 | 最近的中文字幕免费动漫视频 | 日日操夜夜爽 | 精品久久天干天天天按摩 | 色批网站 | 国产欧美日韩综合精品一区二区 | 成人丁香婷婷 |