首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C# 轉型 C++ 之路(一):常量、自增、long 類型差異詳解

     編輯:C++ 入門

C# 轉型 C++ 之路(一):常量、自增、long 類型差異詳解

全職投入 C/C++ 學習,首要任務是搞清與 C# 的核心語法差異。本文整理三個最易踩坑的基礎點。

1. 常量定義:#define vs const

  • C#:用 const 定義編譯期常量,屬於語言關鍵字,有類型檢查、作用域。
  • C/C++:
    • #define PI 3.14 是預處理器宏,本質是文本替換,無類型、無作用域,僅在預編譯階段展開。
    • const int MAX = 100; 在 C++ 中是只讀變量,有類型、有作用域,必須初始化;但在 C 中 const 變量仍佔用內存,且不可用於陣列大小等常量表達式(C99 後可用 VLA)。
  • 最佳實踐:C++ 首選 constexpr (C++11) 或 const;避免宏定義常量,除非需條件編譯。

2. 自增/自減運算副作用:i++ + i 的陷阱

int i = 10;
int a = i++ + i; // C#: a=21  C: a=20
int b = ++i + i; // C#: a=22  C: a=22
  • C#:i++ 的副作用在「下一次使用」前完成,語言規範嚴格定義求值順序,結果確定。
  • C/C++:i++ + i 屬於未定義行為(C++17 前)或未規定行為(C++17 起),因同一序列點修改並讀取同一變量。不同編譯器、優化等級可能產生不同結果。
  • 鐵律:絕不在同一表達式中對同一變量同時進行修改與讀取。拆分語句:int t = i; i++; a = t + i;

3. long 類型大小:平台相關性

平台C/C++ longC/C++ long longC# long
32 位 OS4 bytes8 bytes8 bytes
64 位 Linux/Unix (LP64)8 bytes8 bytes8 bytes
64 位 Windows (LLP64)4 bytes8 bytes8 bytes
  • C# long 永遠是 8 字節(int64),跨平台一致。
  • C/C++ long 大小由資料模型決定,不可假設為 8 字節。
  • 需固定寬度時,使用 <cstdint> 提供的 int32_t, int64_t 等。

總結

從 C# 轉 C++,思維轉變核心在於:宏是文本替換、副作用順序未定義、基本類型大小平台相關。養成「用 constexpr/const 替代宏、拆分有副作用表達式、用固定寬度類型」的習慣,能避開 90% 的入坑點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved