不知各位有木有想過,在C語言以及C 編程語言中我們最常用的數是啥?據本人不完全統計,“0”這個數字是首當其沖的[呲牙]。下面我們先來看看,在C語言中0能用來表示啥~
if(100) { } // 這裡相當于:if(100 != 0) { },因此條件為真
if(0.5) { } // 這裡相當于:if(0.5 != 0) { },因此條件為真
if(NULL) { } // 這裡相當于:if(NULL != 0) { },因此條件為假
因此 0 在C語言中可被表示為任何一種基本類型。它是名副其實的“百搭”~[偷笑]當然,這也得感謝于其他一些标準(比如IEEE754規格化浮點數标準對0表示的定義)對0賦予了非常統一的語義。因此,不光光是在C語言中,而且在其他大部分主流編程語言中,0 在數值上表示為0,對于布爾值表示為假,對于字符表示為空字符、對于指針(或引用)表示為空指針!這意味着什麼呢?0可以對任何基本類型進行初始化!我們下面看以下代碼:
對結構體對象初始化為全零
有了上面對0的認識,那我們下面來舉一個例子,如何利用0來快速對一個結構體對象對其所有成員初始化為0。
通常古老的做法是聲明一個結構體對象,然後調用 memset 将其成員清空。而從C99開始,我們可以用初始化器将其成員輕松清0,代碼幹淨整潔,而且編譯器還能方便通過使用SIMD指令優化清零操作。我們看以下代碼:
上述代碼中,假如我們使用了GNU語法擴展(比如指定了-std=gnu99或-std=gnu11),那麼 { 0 } 可直接用 { } 表示,裡面的0可省。
下面我們來檢驗一下,上述代碼中的objS和objT的每個成員是否真的都為0了。
通過調試器我們可以簡潔又清楚地看到,objS和objT這兩個對象的所有成員确實被清零了。是不是非常方便?[憨笑]
其他常用的庫對0的定義我們在寫代碼時常常會将 0 作為一個無效值進行處理。而不少開源庫以及其他一些标準庫常常會将 0 作為“返回正常值”的錯誤碼。比如,OpenCL中表示成功狀态碼的 CL_SUCCESS 就被定義為0;Vulkan API中表示成功狀态碼的 VK_SUCCESS 也被定義為0;還有CUDA中表示成功狀态碼的 cudaSuccess 也被定義為0。因為與0進行比較對于主流處理器而言非常方便靈活,有時候可優化為直接對計算結果做ZF标志位的判定即可,連 CMP 或 TEST 這種比較指令都不需要用。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!