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

C 語言經典面試題:一年有多少秒?宏定義陷阱全解析

     編輯:關於C

面試題:定義宏 SECONDS_PER_YEAR

常規答案(陷阱)

#define SECONDS_PER_YEAR (60*60*24*365UL)

看似正確,實則忽略了閏年與天文年差異。面試官往往追問:「每年秒數都一樣嗎?」

天文年科學數值

年份類型定義秒數(約)
回歸年兩次春分點間隔365天5時48分46秒 = 31,556,926 秒
恆星年地球繞太陽360°365天6時9分10秒 = 31,558,150 秒
儒略年平均 365.25 天31,557,600 秒
公曆年400年97個閏年平均 365.2425 天 = 31,556,952 秒

精確宏定義方案

方案一:回歸年(科學計算)

#define SECONDS_PER_TROPICAL_YEAR \
    (365*24*60*60 + 5*60*60 + 48*60 + 46)  // 31556926
/* 更精確:365天5時48分45.975456秒 → 需用浮點數 */
#define SECONDS_PER_TROPICAL_YEAR_PRECISE 31556925.975456

方案二:恆星年

#define SECONDS_PER_SIDEREAL_YEAR \
    (365*24*60*60 + 6*60*60 + 9*60 + 10)  // 31558150

方案三:公曆年(工程常用)

#define SECONDS_PER_GREGORIAN_YEAR_AVG \
    (365*24*60*60 + 97*24*60*60/400)  // 平均值
/* 或簡單版:按 365 天計算,註明為「平年」 */
#define SECONDS_PER_COMMON_YEAR (60*60*24*365UL)  // 31536000

面試核心考點

  1. 類型安全:加 UL 後綴防止 16 位系統溢出
  2. 可讀性:寫出公式而非魔術數字,編譯器常量折疊優化
  3. 嚴謹性:區分平年/閏年/天文年,註明定義依據
  4. 浮點 vs 整數:高精度需 double,32 位 float 足夠

閏年規則補充

bool is_leap(int year) {
    return (year%4==0 && year%100!=0) || (year%400==0);
}

總結

這道題考察的不僅是宏寫法,更是工程思維:明確需求語境、選擇合適精度、文檔化假設。回答時先給出通用工程版,再展開科學細節,展現深度。

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