跳至主要内容

CH4 Variables and Arrays

備註

本文為 2021-Fall 學期旁聽台大資管系孔令傑教授開授的 Programming Design 所記錄的課程筆記。課程內容程式碼可以參閱我的 Github repo: C++ Programming-Design-2021-Fall

Basic data type

Limit of C++

一個可以查看各個資料型態極限大小的 Library,https://www.cplusplus.com/reference/climits/ ,使用時加上:

#include <climits>
// 從C語言就有的函式庫會以c開頭

參考4_1.cpp

sizeof

回傳一資料型態佔有的空間大小(byte)

int a;
sizeof(a);

參考4_2.cpp

overflow

儲存超出該資量料型態範圍的數值 參考4_3.cpp

char

用one byte(-128~127)將字元編碼,it's also integer!

bool

在c++中,非0數都被認定為true,在做控制流程時需注意

precision

浮點數在2進位表示法中常常無法被精確表示,如:
3.5=011.1,3.25=011.01,3.375=011.0113.5 = 011.1, 3.25=011.01, 3.375=011.011 但是,
3.4?3.4?
僅有部分數字恰巧可以用2的冪次方相加來表示,因此浮點數幾乎都會遇到精確度的問題。
參考4_6.cpp, 4_7.cpp


Constants and casting

變數就像是容器,不同型態的變數就像容量大小與形狀不同的容器,舉例來說:

  • long >= int >= short
  • “Shapes” of int and float are different

Casting

  • Implicit casting: from a small type to a large type.
  • Explicit casting: from a large type to a small type. (工程師需要明確指出如何cast)

Explicit casting

  • int a = 5.6; is not good.
  • int a = static_cast<int>(5.6); is better.

To cast basic data types, we use static_cast:

static_cast<type>(expression)


Array

1d Array

宣告方式: data_type array_name [number of elements]
佔據number of elements * sizeof(data_type) 的空間(byte)
參考4_8.cpp

C++ array不會自動初始化,在宣告array時電腦只是劃出一塊記憶體空間而已,這塊記憶體空間上可能存著任意的數值。並且就算存取超出array宣告範圍的index也可能不會發生compilation error,因此需要小心array boundary,若不小心存取到超出範圍的記憶體空間剛好是別的應用程式的空間,就會發生run time error。
參考4_9.cpp, 4_10.cpp, 4_11.cpp, 4_12.cpp

Things you cannot (should not) do

// DO NOT do this 
int x = 0;
cin >> x;
// very bad!
int array[x];
array[2] = 3; // etc
// Do this 
int x = 0;
cin >> x; // good!
int* array = new int[x];
array[2] = 3; // etc.

2d Array

2d Array在記憶體上沒有column的概念,2d Array 實際上就是多個1d Array,假設一陣列array[2][3],那麼a[1], &a[1], &a[1][0]回傳的都是同一個記憶體位置,2d Array的記憶體快快儲存方式是線性且連續的,也就是說array中相鄰的兩個index記憶體區塊也是相鄰的。 參考4_13.cpp, 4_14.cpp, 4_15.cpp, 4_16.cpp


Reference