全職投入 C/C++ 學習,首要任務是搞清與 C# 的核心語法差異。本文整理三個最易踩坑的基礎點。
const 定義編譯期常量,屬於語言關鍵字,有類型檢查、作用域。#define PI 3.14 是預處理器宏,本質是文本替換,無類型、無作用域,僅在預編譯階段展開。const int MAX = 100; 在 C++ 中是只讀變量,有類型、有作用域,必須初始化;但在 C 中 const 變量仍佔用內存,且不可用於陣列大小等常量表達式(C99 後可用 VLA)。constexpr (C++11) 或 const;避免宏定義常量,除非需條件編譯。int i = 10; int a = i++ + i; // C#: a=21 C: a=20 int b = ++i + i; // C#: a=22 C: a=22
i++ 的副作用在「下一次使用」前完成,語言規範嚴格定義求值順序,結果確定。i++ + i 屬於未定義行為(C++17 前)或未規定行為(C++17 起),因同一序列點修改並讀取同一變量。不同編譯器、優化等級可能產生不同結果。int t = i; i++; a = t + i;| 平台 | C/C++ long | C/C++ long long | C# long |
|---|---|---|---|
| 32 位 OS | 4 bytes | 8 bytes | 8 bytes |
| 64 位 Linux/Unix (LP64) | 8 bytes | 8 bytes | 8 bytes |
| 64 位 Windows (LLP64) | 4 bytes | 8 bytes | 8 bytes |
long 永遠是 8 字節(int64),跨平台一致。long 大小由資料模型決定,不可假設為 8 字節。<cstdint> 提供的 int32_t, int64_t 等。從 C# 轉 C++,思維轉變核心在於:宏是文本替換、副作用順序未定義、基本類型大小平台相關。養成「用 constexpr/const 替代宏、拆分有副作用表達式、用固定寬度類型」的習慣,能避開 90% 的入坑點。