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

C++ 程序設計核心技巧:位運算、類型轉換與經典面試題

     編輯:關於C++

1. 全局變量二次賦值

int i = 1;
int i = i; // C++ 允許,第二個 i 指向第一個 i,值為 1

輸出 `1`。注意區分作用域。

2. 計算二進制中 1 的個數

int countOnes(int x) {
    int c = 0;
    while (x) { x &= (x - 1); ++c; } // 每次消除最低位 1
    return c;
}

3. 判斷 2 的冪次

bool isPowerOfTwo(int x) {
    return x > 0 && (x & (x - 1)) == 0;
}

4. 邏輯運算 vs 位運算

  • `&&` `||` `!`:操作數轉為 `bool`,結果為 `bool`,支持短路。
  • `&` `|` `^` `~`:逐位操作,結果為整數,無短路。

5. printf 參數求值順序

C 標準未規定參數求值順序,編譯器通常**從右向左**壓棧,但**不可依賴**。

int a = 1;
printf("%d %d %d", a++, ++a, a); // 未定義行為

6. 類型轉換:字符截斷與指針別名

unsigned int a = 0xFFFFFFF7;
unsigned char c = (unsigned char)a; // 截斷低 8 位 -> 0xF7 (247)
char *p = (char*)&a; // 指針轉換影響訪問粒度
// *p 訪問第 0 字節 (0xF7),符號擴展為 -9 (0xFFFFFFF7)
unsigned char *q = (unsigned char*)&a; // *q = 0xF7 (247)

7. 位運算求平均與求和

  • 平均:`(x & y) + ((x ^ y) >> 1)` — 無溢出風險。
  • 求和(無 `+`):
    int add(int a, int b) {
        while (b) {
            int sum = a ^ b;       // 無進位加
            int carry = (a & b) << 1; // 進位
            a = sum; b = carry;
        }
        return a;
    }

8. 無判斷求最大值

int max = ((a + b) + abs(a - b)) / 2;

9. 無中間變量交換

a ^= b; b ^= a; a ^= b;

或算術法(可能溢出):`a = a + b; b = a - b; a = a - b;`

10. C 與 C++ 關係

  • C++ 支持函數重載,編譯器修飾符號(name mangling)。調用 C 函數需 `extern "C"` 防止修飾。
  • C 面向過程(算法+數據結構),C++ 面向對象(建模領域對象)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved