色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    2108

    瀏覽量

    73619
  • Type
    +關注

    關注

    1

    文章

    136

    瀏覽量

    22675
  • 操作符
    +關注

    關注

    0

    文章

    21

    瀏覽量

    9040

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    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 ?1424次閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    操作符是對二進制位進行操作的運算。以下是一些常用的位操作符
    的頭像 發表于 11-09 10:59 ?1791次閱讀
    主站蜘蛛池模板: 好看的电影网站亚洲一区| 亚洲综合无码一区二区| 美女胸禁止18以下看| 国内精品视频久久久久免费| 国产精品成人免费视频99| 成人性生交大片免费看金瓶七仙女| 91精品国产91热久久p| 中文字幕乱码一区AV久久| 亚洲中文有码字幕日本| 亚洲视频精品在线观看| 亚洲成AV人电影在线观看| 性色AV乱码一区二区三区视频| 婷婷色色狠狠爱| 无限资源在线观看高清| 午夜毛片在线观看| 亚洲成人免费在线观看| 亚洲精品无码一区二区三区四虎 | 精子射到丝袜上图| 国产美女裸身网站免费观看视频| 国产精品成人观看视频免费| 国产免费网站看v片在线| 国产色婷亚洲99精品AV在| 国语自产拍在线视频普通话| 精品国产麻豆AV无码| 久久无码AV亚洲精品色午夜麻豆 | 国产精品久久久久秋霞影视| 国产精品日本一区二区在线播放| 国产日韩欧美另类| 经典WC女厕所里TV| 麻豆国产99在线中文| 欧美日韩国产在线一区二区| 日本高清免费一本在线观看| 色欲国产麻豆精品AV免费| 午夜影视不充值观看| 一边喂奶一边做边爱| 91久久精品一区二区三区| 草莓视频在线观看免费观看高清| 国产MD视频一区二区三区| 国内精品久久久久影院老司| 久久综合久综合久久鬼色| 欧美一级做a爰片免费|