<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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++
    +關注

    關注

    21

    文章

    2067

    瀏覽量

    72961
  • Type
    +關注

    關注

    1

    文章

    132

    瀏覽量

    22380
  • 操作符
    +關注

    關注

    0

    文章

    20

    瀏覽量

    9002

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

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

收藏 人收藏

    評論

    相關推薦

    MATLAB操作符和特殊字符

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

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

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

    【FPGA學習】 Verilog HDL 語言的表達式及操作符詳細介紹

    表達式是 Verilog HDL 語言中進行邏輯運算和表達最基本的元素。表達式由操作符操作數按照一定的規則組合而成,下面進行詳細介紹。1.操作操作數的類型包括:常量、參數、線網、寄
    發表于 09-20 09:23

    二進制轉換如何設置移位操作符?

    這些移位操作器是如何設置的。我知道他們正在檢查兩個的力量,但是他們是如何做到的,如果是的話,我如何將它應用到更高的比特上。如何設置移位操作符?使用SpkFlash和PIC18F45 25的SelLCD
    發表于 11-19 10:44

    操作符的相關資料分享

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

    操作C語言支持的幾種位操作符是哪些呢

    一、位操作C語言支持的6種位操作符如下:1.不改變其他位的值的狀況下,對某幾個位進行設值。方法:先對需要設置的位用&操作符(對應位&0)進行清零操作,然后用|
    發表于 12-22 08:07

    操作符及其常用方式簡要概述

    目錄前言一、位操作符及其常用方式二、實例應用解析(嵌入式筆試??迹┣把晕?b class='flag-5'>操作在單片機的C語言開發中經常會用到,該操作主要用于讀寫寄存器,這篇文章將會對其的常用方法進行簡要概述。一、位操作符
    發表于 02-17 06:33

    無感方波控制之擇多函數邏輯操作符的理解

    如何此處擇多函數的操作符所表示的意義?
    發表于 10-14 16:19

    【verilog每日一練】移位操作符的使用

    定義變量reg [7:0]a;reg [7:0]b;reg [7:0]c;暫不考慮溢出及小數,用移位操作符(<<、>>)實現b等于a乘以4的結果,c等于a除以8的結果
    發表于 08-14 10:36

    請問C語言文件中的預處理操作符#和##各有什么作用?

    C語言文件中的預處理操作符#和##各有什么作用?
    發表于 11-06 08:09

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

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

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

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

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

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

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

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

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

    操作符是對二進制位進行操作的運算符。以下是一些常用的位操作符
    的頭像 發表于 11-09 10:59 ?502次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>