衡阳派盒市场营销有限公司

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ì)給出警告。最簡單的解決之法就是保證整型符號(hào)的一致性,例如:

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

結(jié)束條件也隨之變?yōu)?a target="_blank">檢測數(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() 可以簡寫為 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)然,還有許多其他方法,比如迭代器、算法和一些技巧,但在范式上來說,那些方法很難比這里展示的方式更加簡潔,就使用來說,記住這里提到的便已足夠。

推薦閱讀點(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)立場。文章及其配圖僅供工程師學(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

原文標(biāo)題:使用 C++20 安全地比較不同類型的整型值

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++20新特性解析

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

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

    您好~需要程序所需的時(shí)間比較長,用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簡單delay函數(shù),不同類型字符的延時(shí)時(shí)間不同

    c51delay函數(shù)不同類型參數(shù)的不同效果
    發(fā)表于 11-29 10:51 ?11次下載
    <b class='flag-5'>c</b>51簡單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 ?203次閱讀
    百家乐官网娱乐城代理| 六合投注系统| 百家乐打法分析| 平阴县| 百家乐网站平台| 赌博百家乐官网下载| 大发888国际| 百家乐长龙怎么预判| 缅甸百家乐官网网上投注| 威尼斯人娱乐城总部| 百家乐官网平玩法官方网址| 柘城县| 威尼斯人娱乐城真钱赌博| 百家乐怎样玩的| 缅甸百家乐官网赌场娱乐网规则 | 新锦江百家乐娱乐网| 百家乐官网里靴是什么意识| 宜良县| 东方太阳城二手房| 百家乐注码调整| 网上百家乐官网信誉| 香港六合彩管家婆| 百家乐网真人真钱群| 百家乐官网五星宏辉怎么玩| 宝马会线上娱乐| 百家乐群必胜打朽法| 百家乐真钱在线| 现金百家乐官网攻略| 皇冠网小说微博| 全讯网| 百家乐7杀6| 百家乐官网正负计算| 金沙城百家乐官网大赛规则| 香港六合彩曾道人| 克拉克百家乐的玩法技巧和规则 | 百家乐游戏真钱游戏| 百家乐官网路单| 百家乐官网类游戏平台| 娱乐城代理| 东京太阳城王子酒店| 百家乐龙虎台布|