C++ 结构时间;vs tm time={}。输出相同但不相同?
我在这个叫Kattis的网站上做了一些编程问题。以下是我正在做的问题的链接: 当我试图解决这个问题时,我发现了一些非常非常奇怪的事情 在我开始之前,这里有两个代码: 第一个:C++ 结构时间;vs tm time={}。输出相同但不相同?,c++,struct,tm,ctime,C++,Struct,Tm,Ctime,我在这个叫Kattis的网站上做了一些编程问题。以下是我正在做的问题的链接: 当我试图解决这个问题时,我发现了一些非常非常奇怪的事情 在我开始之前,这里有两个代码: 第一个: #include <iostream> #include <ctime> #include <string> using namespace std; int main() { //a = day, b = month string days[7] = {"Sunda
#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;
}
#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;
}
vs
tm time = {}; // second code
现在,这就是我发现的非常令人困惑的地方。第一个代码和第二个代码在我的控制台上给出了完全相同的答案。我还通过执行typeid(days[time.tm\u wday]).name()检查了结果的类型(days[time.tm\u wday]),两个答案似乎完全相同
然而,当提交到Kattis网站时,它只接受第二个,不接受第一个
现在,有人能告诉我我错过了什么吗?为什么它只接受一对另一?多谢各位
编辑:
关于Kattis的一些信息:有一个问题需要通过编程来解决。然后它会将你的答案与他们的答案进行核对。如果您的程序输出相同的答案,它将“接受”您的解决方案。如果它不同,那么它就不一样了
例如,假设问题是计算正方形的面积。它给出了几个带有值的示例
例1:(输入:5输出:25)
如果您的控制台在输入5时输出25,则它“接受”您的解决方案。如果它输出一些随机数,比如10,那么它不接受
我的程序输出的值完全相同:
第一个代码输出:星期四。第二个代码输出:星期四等。
但是,只有一个被认为是“正确的”。有两个区别:
struct tm time; // (1)
对
tm time = {}; // (2)
1struct
在C语言中,复合类型的名称包括struct
关键字,struct tm
。在C++中,类型的名称本身就足够了,“<代码> TM <代码>”但出于兼容性考虑,它可以以struct
作为前缀。关于这方面的更多信息:
因此,关于struct
关键字,实际上只有表面上的区别
2.初始化
(1)
定义tm
类型的变量time
。由于tm
为,因此未初始化。使用未初始化的值通常会导致未定义的行为。(2)
定义和列表初始化tm
类型的变量time
。这反过来会初始化tm
,程序的行为也会得到很好的定义
关于这方面的更多信息:
为什么这很重要?
未完全初始化time
,然后调用mktime(&time)代码>导致未定义的行为。一切都可能发生。每次运行程序时可能会有所不同,这取决于所使用的确切编译器、它所链接的libs、操作系统、硬件、任何东西,一切。它也可以按预期工作。更多信息:
我怀疑该程序在您的环境中偶然运行,但在目标上失败。您所说的“接受”是什么意思?第一个变量没有正确初始化tm
,因此您得到了未定义的行为。@NeilButterworth我添加了一些关于Kattis@VTT第一个和第二个都输出完全相同的字符串。struct tm
不是一个POD,而是一个结构。然而,如果没有一个定义的构造函数,你说它未初始化的说法是正确的,而OPs问题的关键是。@jwm为什么你认为结构不能是PODs?是一个类(类/结构/联合)类型,它是普通的标准布局,没有非静态的非POD成员tm
完全符合此定义。顺便说一句,答案链接到POD的相同定义,“没有定义的构造函数”不是问题所在。没有用户定义构造函数的非POD类型将由表达式T初始化
,使用。修改我上面的评论,注意T
将调用编译器生成的T()
构造函数,但它不会初始化内置类型的成员(例如,int
数据成员)。
tm time = {}; // (2)