首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 指針算術與後置自增:*(primes_i + count_i++) = trail_i 解析

     編輯:程式設計疑難解答

代碼含義


*(primes_i + count_i++) = trail_i;

等價展開:


int index = count_i;      // 當前 count_i 值
count_i++;                // 後置自增,count_i 變為 index+1
primes_i[index] = trail_i; // 指針算術:primes_i + index 即 &primes_i[index],解引用賦值

逐步解析

  1. `primes_i` 是 `long[]` 數組名,退化為 `long*` 指向首元素。
  2. `count_i++` 先取當前值參與加法,再自增。
  3. `primes_i + count_i` (舊值) 計算偏移地址,指向數組第 `count_i` 個元素。
  4. `*` 解引用,將 `trail_i` 賦值給該元素。
  5. 循環中反覆執行,依次填充 `primes_i[3]`、`primes_i[4]`...`primes_i[99]`。

上下文背景

代碼實現**試除法求質數**:`primes_i` 存儲已找到的質數,`trail_i` 為候選數,`count_i` 為已找到質數個數。內層循環用已有質數試除,無因數則加入質數表。

現代 C++ 改寫建議


std::vector primes = {2, 3, 5};
long candidate = 5;
while (primes.size() < 100) {
    candidate += 2;
    bool isPrime = true;
    for (long p : primes) {
        if (p * p > candidate) break; // 優化:只試除到 sqrt
        if (candidate % p == 0) { isPrime = false; break; }
    }
    if (isPrime) primes.push_back(candidate);
}
  • `vector` 自動管理內存、知曉大小、避免指針算術錯誤。
  • 範圍 `for` 遍歷更清晰。
  • 試除優化至 `sqrt(candidate)` 大幅提速。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved