2016-11-19 62 views
0

我在C++ 11有一個自定義的數據結構date嵌套的if-else不工作的自定義結構C++

struct date { 
    int day; 
    int month; 
    int year; 
}; 

我想比較兩個date S和爲它編寫函數:

int compare_dates(date a, date b) { 
    int result = 0; 

    if (a.year < b.year) { 
     result = -1; 
    } else if (a.year == b.year) { 
     if (a.month < b.month) { 
      result = -1; 
     } else if (a.month == b.month) { 
      if (a.day < a.day) { 
       result = -1; 
      } else if (a.day > a.day) { 
       result = 1; 
      } 
     } else { 
      result = 1; 
     } 
    } else { 
     result = 1; 
    } 

    return result; 
} 

但此功能無法正常工作。我花了很多時間來調試它,發現下面的代碼部分的一些問題:

} else if (a.month == b.month) { 
    if (a.day < a.day) { 
     result = -1; 
    } else if (a.day > a.day) { 
     result = 1; 
    } 
} else { 
    result = 1; 
} 

有調試期間兩個截圖,first} else if (a.month == b.month) {second當我點擊調試器下一行。這發生在所有輸入上。爲什麼debbuger每次都沒有輸入if (a.day < a.day) {result = 1;

+0

你可能在其他地方有未定義的行爲,這可能會導致各種奇怪的事情。錯誤不能由您向我們展示的部分複製。請發佈完整的代碼。請參閱http://stackoverflow.com/help/mcve –

+0

感謝@ChristianHackl的評論,下次我將根據* mcve *標準添加代碼。 –

回答

2

if (a.day < b.day) { 
    result = -1; 
} else if (a.day > b.day) { 
    result = 1; 
} 

,而不是

if (a.day < a.day) { 
    result = -1; 
} else if (a.day > a.day) { 
    result = 1; 
} 

兩個測試嘗試a.day < a.daya.day > a.day遇上假的,所以result = -1result = 1永遠不會執行。

我假定編譯器優化代碼作爲第一屏幕截圖如下

} else if (a.month == b.month) { 
} else { 
    result = 1; 
} 
+0

這究竟如何解釋爲什麼程序跳過一個完美有效的==比較? –

+0

@ChristianHackl - 我想這是因爲當條件爲真時應該執行的代碼是一個'if' /'else if'條件有假的 – max66

+0

真的解決了我的問題,謝謝!但我仍然困惑爲什麼調試器不能幫助我。 –

0

線沒有25,

if (a.day < a.day) 

它應該是

if (a.day < b.day) 

同樣的錯誤是在線路27.

1

這可能是編譯器優化妨礙你。

正如其他人所觀察到的,您在該塊內有兩個拼寫錯誤。 a.day < a.daya.day > a.day根據定義始終是錯誤的。因此,該區塊中不會發生任何事情。沒有可觀察到的行爲。這可能是編譯器爲了節省速度和/或空間而完全消除整個事情的原因。

我不知道你正在使用哪個編譯器,或者你傳遞了哪個標誌,但是如果你禁用所有優化,那麼調試器應該按照你的預期工作。您也可以嘗試將std::cout << "...\n";放入塊中以強制執行某些可觀察的行爲,並查看是否會更改某些內容。

這也是一個很好的理由來真正瞭解你的編譯器是如何工作的,而不是所有的IDE都會覆蓋它的功能。

+0

我使用GNU SCC編譯器與' -std = C++ 11' –

+0

@DmytroRudnitskikh:然後嘗試添加「-O0」。 –