我在C ++ 11中有一个自定义数据结构date
:
struct date {
int day;
int month;
int year;
};
我想比较两个date
和写函数:
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;
}
调试期间有两个屏幕截图,} else if (a.month == b.month) {
和first,当我在调试器中点击下一行时。所有输入都会发生这种情况为什么debbuger每次都没有进入if (a.day < a.day) {
或result = 1;
?
答案 0 :(得分: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.day
和a.day > a.day
都是假的,因此永远不会执行result = -1
和result = 1
。
我认为编译器优化代码如下
} else if (a.month == b.month) {
} else {
result = 1;
}
答案 1 :(得分:1)
可能是编译器 optimisations 阻碍了你。
正如其他人所观察到的,你在街区内有两个拼写错误。根据定义,a.day < a.day
和a.day > a.day
始终为false。因此,块中不会发生任何事情。没有可观察到的行为。这可能就是编译器为了节省速度和/或空间而完全消除整个事物的原因。
我不知道您使用的是哪个编译器,或者您传递了哪些标志,但如果禁用所有优化,则调试器应该按预期工作。您还可以尝试将std::cout << "...\n";
放入块中以强制执行某些可观察的行为,并查看是否会发生某些变化。
这也是真正了解编译器如何工作的一个很好的理由,而不会让所有IDE漏掉它的功能。
答案 2 :(得分:0)
首先截屏第25行,
if (a.day < a.day)
应该是
if (a.day < b.day)
同样的错误在第27行。