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

C 語言基礎:輸入兩整數輸出較大值——從錯誤代碼看核心語法點

     編輯:程式設計綜合問答

原始錯誤代碼

#include <stdio.h>
#include <stdlib.h>

void main() {
    scanf("%d,%d", &a, &a, &b);  // 錯誤 1、2、3
    c = max(a, b);                // 錯誤 4
    print("max=%d", c);           // 錯誤 5
    return 0;
}

五大錯誤逐一拆解

行號錯誤代碼問題分析正確寫法
1void main()C 標準要求 int main() 或 int main(void)int main(void)
2scanf("%d,%d", &a, &a, &b)格式字串 2 個 %d 對應 3 個參數;重複 &a;變數未宣告int a, b; scanf("%d %d", &a, &b);
3c = max(a, b)C 標準庫無 max 函數(C++ 有 std::max)自寫巨集/函數或三元運算子
4print(...)C 語言輸出函數是 printf,非 printprintf("max=%d\n", c);
5變數 a,b,c 未宣告類型C 需顯式宣告,且需在區塊開頭(C89)或使用前(C99)int a, b, c;

標準修正版

#include <stdio.h>
#include <stdlib.h>

// 方案 1:巨集(編譯期展開,零開銷)
#define MAX(x, y) ((x) > (y) ? (x) : (y))

// 方案 2:內聯函數(類型安全,現代 C 推薦)
static inline int max_int(int x, int y) {
    return x > y ? x : y;
}

int main(void) {
    int a, b, c;
    
    printf("請輸入兩個整數(空格分隔):");
    if (scanf("%d %d", &a, &b) != 2) {
        fprintf(stderr, "輸入格式錯誤\n");
        return EXIT_FAILURE;
    }
    
    c = MAX(a, b);  // 或 max_int(a, b)
    printf("max=%d\n", c);
    
    return EXIT_SUCCESS;
}

進階延伸:泛型最大值(C11 _Generic)


#define MAX_GENERIC(x, y) _Generic((x), \
    int: max_int, \
    double: max_double, \
    float: max_float \
)(x, y)

static inline double max_double(double x, double y) { return x > y ? x : y; }
static inline float max_float(float x, float y) { return x > y ? x : y; }

// 使用
int    imax = MAX_GENERIC(3, 5);
double dmax = MAX_GENERIC(3.14, 2.71);

避坑指南

  • scanf 格式字串:%d,%d 要求輸入 "3,5";%d %d 允許 "3 5"、"3\n5",後者更友善
  • 返回值檢查:scanf 返回成功匹配項數,必須檢查防止垃圾值
  • 巨集副作用:MAX(a++, b) 會導致 a 增加兩次,內聯函數無此問題
  • 標準合規:嚴格模式編譯 gcc -std=c11 -pedantic -Wall -Wextra
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved