C++ 標準**未規定**多參數的求值順序。編譯器依優化需求自行決定(左至右或右至左)。一般參數無影響,但**含副作用運算式時會產生歧義**:
int z = add_int(++x, x + y); // 不同編譯器可能產生不同結果
最佳實踐:避免在參數列中使用有副作用的運算式,改用暫存變數。
允許在宣告/定義時指定預設值,**右邊參數有預設值則左邊也必須有**。
int add_int(int x, int y = 10); // 合法
// 呼叫
add_int(15); // 等同 add_int(15, 10)
add_int(15, 20); // 使用 20
預設值可為任意複雜運算式。
void func(int arr[], int n);
int a[8] = {1,2,3,4,5,6,7,8};
func(a, 8); // 函數內修改 arr 會影響 a
陣列名即首元素位址的常數指標。形參可用 int* arr 或 int arr[],效果相同。
typedef int Array8[8]; // 先定義陣列類型
void func(Array8 &arr, int n) {
for (int i = 0; i < n; ++i)
arr[7] += arr[i]; // 直接操作原陣列
}
int a[8] = {1,3,5,7,9,11,13,15};
func(a, 8); // 傳遞引用,無複製開銷
優點:型別安全、避免指標退化、語意明確、編譯器可檢查陣列大小匹配。
typedef 或 C++11 std::array/std::span 獲得最佳型別安全