不知各位有木有想過,在C語言以及C++編程語言中我們最常用的數是啥?據本人不完全統計,“0”這個數字是首當其沖的。下面我們先來看看,在C語言中0能用來表示啥~
作為整數:0就是數值為0的整數。作為浮點數:0就是數值為 +0.0 的規格化浮點數表示。(-0.0表示為最高位的符號位為1,其余位為0。比如 -0.0 的32位單精度浮點數的規格化表示為0x8000'0000。)作為關系表達式的值:0就是假(false);非零(通常指定為1)為真(true)。C語言中原本沒有引入布爾類型,因此任何一個可被轉換為一個關系表達式的表達式(比如整數表達式),均可用跟0比較來獲取最終關系表達式的結果值。比如:
if(100) { } // 這里相當于:if(100 !=0) { },因此條件為真
if(0.5) { } // 這里相當于:if(0.5 !=0) { },因此條件為真
if(NULL) { } // 這里相當于:if(NULL !=0) { },因此條件為假作為字符:0就表示為空字符('\0')。這不單單適用于ASCII碼,其他編碼格式均遵循這一規則。這也使得我們判定任何一種編碼格式的字符串是否結束,均能用0來進行判讀~作為指針值:0表示為空指針(NULL)。C語言中通常把 NULL 定義為 (void*)0;而C++中通常直接定義為 0。而在C++中,對一個類成員虛函數的聲明后面賦值為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 這種比較指令都不需要用。
版權聲明:本文來自互聯網整理發布,如有侵權,聯系刪除
原文鏈接:http://www.freetextsend.comhttp://www.freetextsend.com/tiyuzhishi/4904.html