C++ 純函數

2023-03-20 15:58 更新

如果一個函數的返回結果只取決于參數值,并且沒有像修改參數、輸出一些值等副作用,那么就可認為此函數是純函數。

下面這個after函數就是一例。此函數比較兩個Time變量并返回一個布爾值并指出第一個操作數是否比第二個晚:

bool after (Time& time1, Time& time2) {
    if (time1.hour > time2.hour) return true;
    if (time1.hour < time2.hour) return false;
    if (time1.minute > time2.minute) return true;
    if (time1.minute < time2.minute) return false;
    if (time1.second > time2.second) return true;
    return false;
}

當兩個時間相等時,函數返回什么?函數是否有適當的返回值?如果是你為此函數編寫文檔,你會專門提及這種情況嗎?

另外一例是addTime函數,負責計算兩個時間值之和。比如現在是9:14:30,你的面包機工作時間是3小時35分鐘,你可以使用addTime函數來計算什么時候面包做好。

下面是此函數的一個草稿,不一定完全正確:

Time addTime (Time& t1, Time& t2) {
    Time sum;
    sum.hour = t1.hour + t2.hour;
    sum.minute = t1.minute + t2.minute;
    sum.second = t1.second + t2.second;
    return sum;
}

下面舉一個使用該函數的例子。若currentTime為當前時間,breadTime為面包機做面包用的總時間,你就可以用addTime計算面包做好的時間了。

Time currentTime = { 9, 14, 30.0 };
Time breadTime = { 3, 35, 0.0 };
Time doneTime = addTime (currentTime, breadTime);
printTime (doneTime);

這段程序的輸出為12:49:30,答案正確。另外,還有些例子的結果是不正確的。你能想出一個嗎?

這個函數的問題在于它沒有處理秒數或分鐘數加起來超過60的情況。這種情況我們必須將多出的秒數“進位”到分鐘,或者多出的分鐘進位到小時。

下面是再次修改函數后的正確版本:

Time addTime (Time& t1, Time& t2) {
    Time sum;
    sum.hour = t1.hour + t2.hour;
    sum.minute = t1.minute + t2.minute;
    sum.second = t1.second + t2.second;
    if (sum.second >= 60.0) {
        sum.second -= 60.0;
        sum.minute += 1;
    }
    if (sum.minute >= 60) {
        sum.minute -= 60;
        sum.hour += 1;
    }
    return sum;
}

代碼正確了,但也變長了。稍后,我將給出另一個解決方案,能大大簡短代碼。

這段代碼給出了我們之前沒見過的兩個操作符:+=和-=,用于簡潔的表示變量的增減。比方說,語句

sum.second -= 60.0;

和語句

sum.second = sum.second - 60;

是等價的。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號