首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >struct tm time;vs tm time = {}。输出相同但不相同?

struct tm time;vs tm time = {}。输出相同但不相同?
EN

Stack Overflow用户
提问于 2018-05-30 06:18:55
回答 1查看 206关注 0票数 1

我在一个叫Kattis的网站上做了一些编程问题。这是我正在做的问题的链接:https://open.kattis.com/problems/datum

当我试图解决这个问题时,我发现了一些非常非常奇怪的事情。

在我开始之前,这里有两个代码:

第一个:

代码语言:javascript
复制
#include <iostream>
#include <ctime>
#include <string>

using namespace std;

int main()
{
    //a = day, b = month
    string days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    struct tm time;

    cin >> time.tm_mday >> time.tm_mon;

    time.tm_year = 2009-1900;
    time.tm_mon--;

    mktime(&time);

    cout << days[time.tm_wday] << endl;

    return 0;
}

第二个:

代码语言:javascript
复制
#include <iostream>
#include <ctime>
#include <string>

using namespace std;

int main() {
    //a = day, b = month
    string days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    tm time = {};

    cin >> time.tm_mday >> time.tm_mon;

    time.tm_year = 2009-1900;
    time.tm_mon--;

    mktime(&time);

    cout << days[time.tm_wday] << endl;

    return 0;
}

它们是完全相同的代码,除了这两个代码中唯一的区别是:

代码语言:javascript
复制
struct tm time; // first code

vs

代码语言:javascript
复制
tm time = {}; // second code

现在,这就是我感到非常困惑的地方。第一个代码和第二个代码在我的控制台上给出了完全相同的答案。我通过执行typeid (daystime.tm_wday)和.name()检查了结果的类型(daystime.tm_wday),两个答案似乎完全相同。

然而,当提交到Kattis网站时,它只接受第二个,而不接受第一个。

现在,谁能告诉我我错过了什么?为什么它只接受一个而不是另一个?非常感谢!

编辑:一些关于Kattis的信息:会有一个问题,你必须通过编程来解决它。然后,它会将你的答案与他们的答案进行核对。如果您的程序输出相同的答案,它将“接受”您的解决方案。如果它不同,那么它就不会。

例如,假设这个方程是用来计算正方形的面积的。它给出了几个带有值的示例。

例1:(输入:5输出: 25)。

如果您的控制台在输入5时输出25,则它“接受”您的解决方案。如果它输出一些随机数,比如,10,那么它不会接受。

我的程序的问题是它输出完全相同的值:

第一个代码输出:星期四。第二个代码输出:星期四等。但是只有一个被认为是“正确的”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-30 07:06:53

有两个差异在起作用:

代码语言:javascript
复制
struct tm time; // (1)

对比

代码语言:javascript
复制
tm time = {}; // (2)

1个struct

在C中,复合类型的名称在这里包含struct关键字"struct tm“。在C++中,类型的名称本身就足够了,这里是"tm“;但是为了兼容起见,可以用struct作为前缀。更多信息:Difference between 'struct' and 'typedef struct' in C++?

因此,关于struct关键字,实际上只是表面上的区别。

2.初始化

(1)定义了tm类型的变量time。由于tma POD,因此不会进行初始化。使用未初始化的值通常会导致未定义的行为。

(2)定义并列表初始化tm类型的变量time。这反过来会对tm进行零初始化,并且程序的行为是明确定义的。

更多信息:What do the following phrases mean in C++: zero-, default- and value-initialization?

为什么这很重要?

未完全初始化time然后调用mktime(&time);会导致未定义的行为。一切都有可能发生。每次运行你的程序时,它可能是不同的,它可能取决于所使用的确切编译器,它所链接的库,操作系统,硬件,任何东西。它也可以像预期的那样工作。更多信息:Undefined, unspecified and implementation-defined behavior

我怀疑该程序偶然在您的环境中工作,但在目标上失败。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50593792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档