1. 程式人生 > 實用技巧 >3 布林型別和引用

3 布林型別和引用

目錄

1 布林型別

  • C++ 中的布林型別

    • C++ 在 C 語言的基本型別系統之上增加了 bool
    • C++ 中的 bool 可取的值只有 truefalse
    • bool 只佔用一個位元組
  • 注意:

    • true 代表真值,編譯器內部用 1 來表示
    • false 代表非真值,編譯器內部用 0 來表示
  • 布林型別的值

    • bool 型別只有 true (非 0)和 false (0)兩個值
    • C++ 編譯器會將非 0 值轉換為 true0 值轉換為 false
  • 布林型別的使用示例

    • Demo

      #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;  //b = true;
          a = b;  //a = 1
          
          printf("b = %d, a = %d\n", b, a);  //1,1
          
          b = -5;  //b = true
          a = b;  //a = 1
          
          printf("b = %d, a = %d\n", b, a);  //1,1
          
          a = 10;
          b = a;  //b = false
          
          printf("a = %d, b = %d\n", a, b);  //10,1
          
          a = 0;
          b = a;  //b = false
          
          printf("a = %d, b = %d\n", a, b);  //0,0
          
          return 0;
      }
      
  • 布林型別是 C++ 中的基本資料型別

    • 可以定義 bool 型別的全域性變數
    • 可以定義 bool 型別的常量
    • 可以定義 bool 型別的指標
    • 可以定義 bool 型別的陣列
    • 。。。

2 三目運算子

  • C++ 對三目運算子進行了升級

  • 問題:下面的程式碼正確麼?

    int a = 1;
    int b = 2;
    
    (a < b ? a : b) = 3;
    
    printf("a = %d,b = %d\n",a,b);
    
    • C 語言編譯器編譯:錯誤:error: lvalue required as left operand of assignment
    • C++ 編譯器編譯:正確:a = 3,b = 2
  • C 語言中的三目運算子返回的是變數值不能作為左值使用

  • C++ 中的三目運算子可以直接返回變數本身,既可以作為右值使用,又可以作為左值使用

  • 注意:如果三目運算子可能返回的值如果有一個是常量值,則不能作為左值使用

3 引用

  • 變數名

    • 變數是一段實際連續儲存空間的別名
    • 程式中通過變數來申請並命名儲存空間
    • 通過變數的名字可以使用儲存空間
  • 問題:一段連續的儲存空間只能有一個別名麼?

    • 可以有多個 => 引用
  • C++ 中的引用

    • 引用可以看作一個已定義變數的別名

    • 引用的語法:Type& name = var;

      int a  = 4;
      int& b = a;  //b為a的別名
      
      b = 5;  //操作b就是操作a
      
    • 注意:普通引用在定義時必須用同類型的變數進行初始化

  • 引用示例

    • Demo

      #include <stdio.h>
      
      int main(int argc, char *argv[])
      {
          int a = 4;
          int& b = a;
          
          b = 5;
          
          printf("a = %d\n", a);  //5
          printf("b = %d\n", b);  //5
          printf("&a = %p\n", &a);  //&a = 0xbfe54aec
          printf("&b = %p\n", &b);  //&b = 0xbfe54aec
          
          return 0;
      }
      
  • C++ 對三目運算子做了什麼?

    • 當三目運算子的可能返回都是變數時,返回的是變數引用
    • 當三目運算子的可能返回中有常量時,返回的是值
    int a = 1;
    int b = 2;
    
    (a < b ? a : b) = 3;  //正確,返回a或b的引用,可作為左值
    (a < b ? 1 : b) = 4;  //錯誤,返回1或b的值,不能作為左值