吴忠躺衫网络科技有限公司

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

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

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

如何使用C++20比較不同類型的整型值

CPP開發(fā)者 ? 來源:CPP開發(fā)者 ? 2024-11-11 09:35 ? 次閱讀

本篇介紹幾個(gè)細(xì)瑣的小特性,可以使代碼更加安全可靠。

最常見的情況是采取 for loop 遍歷某個(gè)容器,比如:

std::vectorv(10);
std::iota(v,0);
for(inti=v.size()-1;i>=0;--i){
std::cout<

乍看之下,似乎并無問題,但實(shí)際上卻存在安全隱患,若是 v.size() 的結(jié)果大于 std::numeric_limits::max(),將產(chǎn)生 UB。

倘若你使用了類型推導(dǎo),問題會(huì)更加明顯。

for(autoi=v.size()-1;i>=0;--i){
std::cout<

這會(huì)輸出超出預(yù)期的結(jié)果!i 被推導(dǎo)為 unsigned 整型,i >= 0 將永遠(yuǎn)為真。

這種隱患來自于類型的隱式轉(zhuǎn)換,一般編譯器只會(huì)給出警告。最簡(jiǎn)單的解決之法就是保證整型符號(hào)的一致性,例如:

for(size_ti=v.size()-1;i

結(jié)束條件也隨之變?yōu)?a target="_blank">檢測(cè)數(shù)據(jù)范圍,以避免條件在邏輯上的無效性。但如此一來,可讀性直線降低,C++20 引入了幾個(gè)與此相關(guān)的小特性,可以更安全地解決該問題。

第一個(gè)是一系列整型比較函數(shù),它們可以安全地對(duì)不同符號(hào)的類型進(jìn)行比較。如:

-1>0u;//true
std::cmp_greater(-1,0u);//false

因此,可以用來安全地比較不同符號(hào)的整型。

for(inti=0;std::cmp_less(i,v.size());++i){
std::cout<

通過使用這些安全的比較函數(shù),代碼隱患隨之消除。只是無法逆序遍歷了,逆序時(shí)將 size_t 賦值到 int 依舊有可能產(chǎn)生 UB。

此種情境,更好的方式是采用 std::ssize(),它是一個(gè)有符號(hào)的 size() 輔助函數(shù),表意更加直接。代碼更改為:

for(inti=ssize(v)-1;i>=0;--i){
std::cout<

得益于 ADL,std::ssize() 可以簡(jiǎn)寫為 ssize()。

當(dāng)然,以上只是示例需要,對(duì)于數(shù)據(jù)遍歷,Range-based for loop 是更好的方式,這樣能夠避免很多易被忽視的錯(cuò)誤。

for(constauto&elem:v){
std::cout<

通過 C++20 Views,還可以在遍歷時(shí)組合其他操作,如:

for(constauto&elem:v|std::reverse){
std::cout<

這是可讀性最強(qiáng)的方式。

當(dāng)然,還有許多其他方法,比如迭代器、算法和一些技巧,但在范式上來說,那些方法很難比這里展示的方式更加簡(jiǎn)潔,就使用來說,記住這里提到的便已足夠。

推薦閱讀點(diǎn)擊標(biāo)題可跳轉(zhuǎn)

1、深入淺出 C++ 類型擦除

2、性能大殺器:c++中的copy elision

3、Configuring Transitive Dependencies with Modern CMake

聲明:本文內(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)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62968
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2114

    瀏覽量

    73854
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++20新特性解析

    C++之父都說過,C++20C++語言的一次重大變革,引入了大量的新特性。
    發(fā)表于 10-08 09:07 ?2074次閱讀

    C6000的數(shù)據(jù)類型需要將返回類型定義為什么型?

    您好~需要程序所需的時(shí)間比較長(zhǎng),用TSCL計(jì)時(shí)已經(jīng)不夠了,想用Timestamp_get64()這個(gè)函數(shù)得到64位的計(jì)時(shí),但是C6000的數(shù)據(jù)類型中,只有double是64位的,但
    發(fā)表于 12-26 14:03

    c51delay函數(shù)不同類型參數(shù)的不同效果

    c51delay函數(shù)不同類型參數(shù)的不同效果
    發(fā)表于 01-24 06:55

    STM32CubeIDE不支持C++20語法嗎?

    我正在使用 STM32CubeIDE 編寫 C++ 代碼。IDE 的版本是 1.11.0,它帶有 arm-none-eabi-g++ 版本 10.3-2021.10。編譯器具有一些 C++20 功能
    發(fā)表于 02-02 06:51

    同類型儲(chǔ)能電源參與電網(wǎng)調(diào)頻的效果比較研究

    同類型儲(chǔ)能電源參與電網(wǎng)調(diào)頻的效果比較研究_黃際元
    發(fā)表于 01-04 17:05 ?0次下載

    將不同類型單片機(jī)開發(fā)進(jìn)行比較

    同類型單片機(jī)開發(fā)的比較
    的頭像 發(fā)表于 07-06 05:25 ?2628次閱讀

    plc整型數(shù)比較指令的用法

    CMP(整型數(shù)比較)指令能與正常的觸點(diǎn)連接使用,該指令可以放置在正常觸點(diǎn)允許放置的任何位置。
    的頭像 發(fā)表于 04-05 17:14 ?7344次閱讀
    plc<b class='flag-5'>整型</b>數(shù)<b class='flag-5'>比較</b>指令的用法

    c51簡(jiǎn)單delay函數(shù),不同類型字符的延時(shí)時(shí)間不同

    c51delay函數(shù)不同類型參數(shù)的不同效果
    發(fā)表于 11-29 10:51 ?11次下載
    <b class='flag-5'>c</b>51簡(jiǎn)單delay函數(shù),不<b class='flag-5'>同類型</b>同<b class='flag-5'>值</b>字符的延時(shí)時(shí)間不同

    現(xiàn)代C++20實(shí)戰(zhàn)手冊(cè)

    追其根源,C++ 為何如此受歡迎,除了它本身出色的性能,作為一種高級(jí)面向?qū)ο笳Z言,適用領(lǐng)域極其廣泛,小到嵌入式,大到分布式服務(wù)器,到處可以見到 C++ 的身影;另一個(gè)很重要的原因就是它“最近”不斷發(fā)布具有有趣功能的新語言標(biāo)準(zhǔn),也就是 C
    的頭像 發(fā)表于 01-17 09:55 ?3186次閱讀

    C++20 modules入門

    以前一直有了解C++20的新特性,但是因?yàn)榫幾g器對(duì)此支持的比較少,所以很少實(shí)踐。
    的頭像 發(fā)表于 05-29 15:03 ?1035次閱讀
    <b class='flag-5'>C++20</b> modules入門

    C++20 modules基礎(chǔ)知識(shí)入門

    以前一直有了解C++20的新特性,但是因?yàn)榫幾g器對(duì)此支持的比較少,所以很少實(shí)踐。
    的頭像 發(fā)表于 06-15 11:37 ?929次閱讀
    <b class='flag-5'>C++20</b> modules基礎(chǔ)知識(shí)入門

    C++20無棧協(xié)程超輕量高性能異步庫開發(fā)實(shí)戰(zhàn)

    c++20出來有一段時(shí)間了。其中一大功能就是終于支持協(xié)程了(c++作為行業(yè)大哥大級(jí)別的語言,居然到C++20才開始支持協(xié)程,我也是無力吐槽了,讓多少人等了多少年,等了多少青春)但千呼萬喚他終于還是
    的頭像 發(fā)表于 11-09 10:20 ?1483次閱讀

    c語言整型數(shù)據(jù)的溢出計(jì)算

    C語言編程過程中,對(duì)于整型數(shù)據(jù)的溢出問題需要特別關(guān)注。當(dāng)整型數(shù)據(jù)的超過了它所能表示的范圍時(shí),會(huì)發(fā)生溢出現(xiàn)象,導(dǎo)致結(jié)果不準(zhǔn)確甚至出現(xiàn)異常。本文將以詳盡、詳實(shí)、細(xì)致的方式,分析
    的頭像 發(fā)表于 11-30 11:45 ?3645次閱讀

    同類型AD轉(zhuǎn)換器的比較

    (Integrating ADC)、閃存型(Flash ADC)以及其他如Σ-Δ(Sigma-Delta)調(diào)制型等。以下是對(duì)這些不同類型AD轉(zhuǎn)換器的詳細(xì)比較
    的頭像 發(fā)表于 10-05 11:36 ?2374次閱讀

    如何使用C++20比較同類型整型

    std::numeric_limits::max(),將產(chǎn)生 UB。 倘若你使用了類型推導(dǎo),問題會(huì)更加明顯。
    的頭像 發(fā)表于 11-11 09:35 ?206次閱讀
    九州百家乐的玩法技巧和规则| 新全讯网3344111| 大发888娱乐城官网lm0| 十六浦娱乐城| 百家乐官网赌场代理| 博必发百家乐官网的玩法技巧和规则| 百家乐赌场娱乐城| bet365国际娱乐| 真人百家乐官网源代码| 现场百家乐电话投注| 大发888注册网址| 百家乐官网六合彩| 百家乐群sun811| tt娱乐城备用| 七胜百家乐官网赌场娱乐网规则 | 百家乐免费送现金| 会宁县| 圣淘沙百家乐官网的玩法技巧和规则 | 黄金城百家乐官网手机版| 362百家乐的玩法技巧和规则| 维也纳国际娱乐城| 百家乐官网计划工具| 大发888dafa8668| 百家乐官网赌场软件| 百家乐游戏唯一官网网站| 凤凰百家乐官网娱乐城| 百家乐破解视频| 华人棋牌游戏| 都坊百家乐官网的玩法技巧和规则 | 百家乐体育宝贝| 真钱轮盘游戏| 免水百家乐官网的玩法技巧和规则 | 大发888娱乐场下载yguard| 福贡县| 百家乐庄比闲多多少| 皇冠网现金网| 百家乐隐者博客| 皇冠现金开户| 缅甸百家乐网上投注| 蓝山县| 百家乐楼梯缆 |