嵌套if-else不适用于自定义结构c ++

时间:2016-11-19 10:46:46

标签: c++ algorithm c++11 structure

我在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;

3 个答案:

答案 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.daya.day > a.day都是假的,因此永远不会执行result = -1result = 1

我认为编译器优化代码如下

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

答案 1 :(得分:1)

可能是编译器 optimisations 阻碍了你。

正如其他人所观察到的,你在街区内有两个拼写错误。根据定义,a.day < a.daya.day > a.day始终为false。因此,块中不会发生任何事情。没有可观察到的行为。这可能就是编译器为了节省速度和/或空间而完全消除整个事物的原因。

我不知道您使用的是哪个编译器,或者您传递了哪些标志,但如果禁用所有优化,则调试器应该按预期工作。您还可以尝试将std::cout << "...\n";放入块中以强制执行某些可观察的行为,并查看是否会发生某些变化。

这也是真正了解编译器如何工作的一个很好的理由,而不会让所有IDE漏掉它的功能。

答案 2 :(得分:0)

首先截屏第25行,

if (a.day < a.day)

应该是

if (a.day < b.day)

同样的错误在第27行。