1. 程式人生 > >布爾類型及引用(三)

布爾類型及引用(三)

C++ 布爾類型 引用

今天我們來學習下 C++ 中的布爾類型。說起布爾類型,有的同學可能在 C 語言中聽過,0 代表假,1 代表真。我們在 C 語言中用 int 類型的數來表示布爾類型,這也是可取的。但是在 C++ 中正式引出了布爾類型這個概念,它是一種基本類型。C++ 中的 bool 可取的值只有 true 和 false,理論上 bool 只占用一個字節。註意:true 代表真值,編譯器內部用 1 來表示;false 代表非真值編譯器內部用 0 來表示。

bool 類型只有 true(非0)和 false(0)兩個值,C++ 編譯器會將非 0 值轉換為 true,0 值轉換為 false。下來我們來以代碼為例進行分析

#include <stdio.h>

int main(int argc, char *argv[])
{
    bool b = false;
    int a = b;
    
    printf("sizeof(b) = %d\n", sizeof(b));    // 1
    printf("b = %d, a = %d\n", b, a);        // 0, 0
    
    b = 3;
    a = b;
    
    printf("b = %d, a = %d\n", b, a);        // 1, 1
    
    b = -5;
    a = b;
    
    printf("b = %d, a = %d\n", b, a);        // 1, 1
    
    a = 10;
    b = a;
    
    printf("a = %d, b = %d\n", a, b);        // 10, 1
    
    a = 0;
    b = a;
    
    printf("a = %d, b = %d\n", a, b);        // 0, 0
    
    return 0;
}

我們分析下,第 8 行打印 bool 類型 b 的內存大小,那麽便是為 1 了。由於它初始化為 false ,所以為 0, a = b 當然也為 0 了;第 11 行 b 為非 0。所以第 14 行打印出 1, 1;第 16 行 b 為非 0。所以第 19 行打印出 1, 1;第 21 行 a 為 10,所以第 24 行打印出 10, 1;第 26 行 a 為 0,所以第 29 行打印出 0, 0啦。我們看看編譯結果

技術分享圖片

因為布爾類型是 C++ 中的基本數據類型,所以我們可以定義 bool 類型的:局部變量、全局變量、常量、指針、數組 ... ; C++ 對三目運算符也進行了升級,在 C 語言中的三目運算符返回的是變量值,不能作為左值使用;但在 C++ 中,三目運算符可直接返回變量本身,所以它即可作為右值使用,又可作為左值使用。註意:三目運算符可能返回的值中如果有一個是常量值,則不能作為左值使用。

下來我們以代碼為例進行分析

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    
    (a < b ? a : b) = 3;
    
    printf("a = %d, b = %d\n", a, b);   
    
    return 0;
}

這段代碼在 gcc 中肯定編譯通不過因為三目運算符返回的是變量值,給常量賦值肯定出問題,那麽在 g++ 中,它可以通過,返回的是變量本身,所以第 8 行相當於 a = 3。我們來看看編譯結果

技術分享圖片

我們看到 gcc 編譯直接報錯,但是 g++ 編譯通過,並且成功的改變了 a 的值。在這塊我們就不得不提變量名了,我們之前學過變量是一段實際連續存儲空間的別名;程序中通過變量來申請並命名存儲空間;通過變量的名字可以使用存儲空間。我們再來想一個問題:一段連續的存儲空間只能有一個別名嗎?在 C++ 中新增了引用的概念。那麽什麽是引用呢?引用可以看作一個已定義變量的別名,它的語法格式是:TYpe& name = var;註意:普通引用在定義時必須同同類型的變量進行初始化。我們以代碼為例進行分析

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 3;
    int& b = a;
    
    b = 5;
    
    printf("a = %d\n", a); 
    printf("b = %d\n", b); 
    printf("&a = %p\n", &a);
    printf("&b = %p\n", &b);
    
    return 0;
}

我們看到在第 6 行進行了 a 的引用,也就是說, b 為 a 的別名,改變 b 的值就相當於改變 a 的值啦。我們看看編譯結果

技術分享圖片

我們看到 a 和 b 都改為了 5,並且他倆的地址是一樣的,也就證明了 b 是 a 的別名。那麽回到之前的三目運算符的問題,當三目運算符的可能返回值都是變量時,返回的是變量引用;當三目運算符的可能返回值中有常量時,返回的是值。如下所示

技術分享圖片

通過對布爾類型和引用的學習,總結如下:1、bool 類型是 C++ 新增加的基礎類型,它的值只能是 true 和 false;2、C++ 中的三目運算符可作為左值使用;3、C++ 中的引用可以看作變量的別名來使用;4、三目運算符的可能返回都是變量時,返回的是引用。


歡迎大家一起來學習 C++ 語言,可以加我QQ:243343083

布爾類型及引用(三)