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

C 語言求 100~200 質數:賦值與比較運算子混淆導致全輸出

     編輯:程式設計疑難解答

錯誤代碼

for (n = 100; n <= 200; ) {
    for (i = 2; i <= n - 1; i++) {
        if ((n % i) == 0) break;
    }
    if (i = n) { // 錯誤:賦值而非比較
        printf("%d ", n);
        // ...
    }
    n = n + 1;
}

錯誤分析

  • if (i = n) 是賦值運算,將 n 指派給 i
  • 賦值運算式的值為被指派的值 (n),非零即為 true
  • 導致每個 n 都進入 if 區塊被輸出

修正

if (i == n) { // 比較運算子
    printf("%d ", n);
    // ...
}

完整修正程式碼

#include <stdio.h>
#include <math.h>

int main() {
    int n, i, count = 0;
    
    for (n = 100; n <= 200; n++) {
        int isPrime = 1;
        // 優化:只需檢查到 sqrt(n)
        for (i = 2; i <= sqrt(n); i++) {
            if (n % i == 0) {
                isPrime = 0;
                break;
            }
        }
        if (isPrime) {
            printf("%d ", n);
            if (++count % 10 == 0) printf("\n");
        }
    }
    return 0;
}

優化技巧總結

常見運算子混淆速查

優化點原始改進效能提升
內層迴圈上限n-1sqrt(n)O(n) → O(√n)
偶數跳過檢查所有數2 以外只檢查奇數減半
篩法試除法埃拉托斯特尼篩O(n log log n)
運算子名稱範例結果
=賦值a = 5a 變 5,運算式值 5
==比較a == 5true/false,a 不變
+=加賦值a += 3a = a + 3
++遞增a++ / ++aa = a + 1

編譯器警告

啟用 -Wall -Wextra (GCC/Clang) 或 /W4 (MSVC) 會對 if (i = n) 發出警告:warning: suggest parentheses around assignment used as truth value

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