精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

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

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

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

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

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

倘若你使用了類型推導,問題會更加明顯。

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

這會輸出超出預期的結果!i 被推導為 unsigned 整型,i >= 0 將永遠為真。

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

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

結束條件也隨之變為檢測數據范圍,以避免條件在邏輯上的無效性。但如此一來,可讀性直線降低,C++20 引入了幾個與此相關的小特性,可以更安全地解決該問題。

第一個是一系列整型比較函數,它們可以安全地對不同符號的類型進行比較。如:

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

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

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

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

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

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

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

當然,以上只是示例需要,對于數據遍歷,Range-based for loop 是更好的方式,這樣能夠避免很多易被忽視的錯誤。

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

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

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

這是可讀性最強的方式。

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

推薦閱讀點擊標題可跳轉

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

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

3、Configuring Transitive Dependencies with Modern CMake

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

    關注

    3

    文章

    4304

    瀏覽量

    62427
  • C++
    C++
    +關注

    關注

    22

    文章

    2104

    瀏覽量

    73487

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

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

收藏 人收藏

    評論

    相關推薦

    C++20新特性解析

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

    C6000的數據類型需要將返回類型定義為什么型?

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

    c51delay函數不同類型參數的不同效果

    c51delay函數不同類型參數的不同效果
    發表于 01-24 06:55

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

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

    同類型儲能電源參與電網調頻的效果比較研究

    同類型儲能電源參與電網調頻的效果比較研究_黃際元
    發表于 01-04 17:05 ?0次下載

    將不同類型單片機開發進行比較

    同類型單片機開發的比較
    的頭像 發表于 07-06 05:25 ?2552次閱讀

    plc整型比較指令的用法

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

    c51簡單delay函數,不同類型字符的延時時間不同

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

    現代C++20實戰手冊

    追其根源,C++ 為何如此受歡迎,除了它本身出色的性能,作為一種高級面向對象語言,適用領域極其廣泛,小到嵌入式,大到分布式服務器,到處可以見到 C++ 的身影;另一個很重要的原因就是它“最近”不斷發布具有有趣功能的新語言標準,也就是 C
    的頭像 發表于 01-17 09:55 ?2690次閱讀

    C++20 modules入門

    以前一直有了解C++20的新特性,但是因為編譯器對此支持的比較少,所以很少實踐。
    的頭像 發表于 05-29 15:03 ?940次閱讀
    <b class='flag-5'>C++20</b> modules入門

    C++20 modules基礎知識入門

    以前一直有了解C++20的新特性,但是因為編譯器對此支持的比較少,所以很少實踐。
    的頭像 發表于 06-15 11:37 ?831次閱讀
    <b class='flag-5'>C++20</b> modules基礎知識入門

    C++20無棧協程超輕量高性能異步庫開發實戰

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

    c語言整型數據的溢出計算

    C語言編程過程中,對于整型數據的溢出問題需要特別關注。當整型數據的超過了它所能表示的范圍時,會發生溢出現象,導致結果不準確甚至出現異常。本文將以詳盡、詳實、細致的方式,分析
    的頭像 發表于 11-30 11:45 ?3177次閱讀

    同類型AD轉換器的比較

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

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

    std::numeric_limits::max(),將產生 UB。 倘若你使用了類型推導,問題會更加明顯。
    的頭像 發表于 11-11 09:35 ?84次閱讀