2016-11-19 64 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”。 –