结构 tm 时间;对比时间 = {}。输出相同但不相同?
struct tm time; vs tm time = {}. Same output but not the same?
我在这个名为 Kattis 的网站上做一些编程问题。这是我正在做的问题的 link:https://open.kattis.com/problems/datum
当我试图解决这个问题时,我发现了一些非常非常非常奇怪的事情。
在我开始之前,这里有两个代码:
第一个:
#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;
}
它们是完全相同的代码,除了
这两个代码的唯一区别是:
struct tm time; // first code
vs
tm time = {}; // second code
现在,这让我感到非常困惑。第一个代码和第二个代码在我的控制台上给出了完全相同的答案。我也通过执行 typeid(days[time.tm_wday]).name() 检查了结果的类型 (days[time.tm_wday]),两个答案似乎完全相同。
但是提交到Kattis网站时,只接受第二个,不接受第一个。
现在,谁能告诉我我在这里缺少什么?为什么它只接受一个对另一个?非常感谢!
编辑:
关于 Kattis 的一些信息: 会有一个问题,你必须通过编程来解决它。然后它会检查你的答案和他们的答案。如果您的程序输出相同的答案,它 "accepts" 您的解决方案。如果不同,则不同。
例如,假设问题是计算正方形的面积。它给出了几个带有值的例子。
ex) 案例 1:(输入:5 输出:25)。
如果您的控制台在输入 5 时输出 25,那么它 "accepts" 您的解决方案。如果它输出一些随机数,如 10,则它不接受。
我的程序的问题是它输出完全相同的值:
第一个代码输出:星期四。第二个代码输出:星期四等
但是只有一个被认为是 "correct".
有两个区别在起作用:
struct tm time; // (1)
对比
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
。由于tm
是a POD,所以没有初始化。使用未初始化的值通常会导致未定义的行为。
(2)
定义 并列表初始化 类型 tm
的变量 time
。这反过来 零初始化 tm
并且程序的行为是明确定义的。
更多相关信息:What do the following phrases mean in C++: zero-, default- and value-initialization?
为什么重要?
未完全初始化 time
然后调用 mktime(&time);
导致 未定义的行为 。一切都可能发生。每次你 运行 你的程序可能会有所不同,它可能取决于所使用的确切编译器,它所链接的库,OS,硬件,任何东西,一切。它也可以按预期工作。更多相关信息:Undefined, unspecified and implementation-defined behavior.
我怀疑该程序偶然在您的环境中运行,但在目标上失败。
我在这个名为 Kattis 的网站上做一些编程问题。这是我正在做的问题的 link:https://open.kattis.com/problems/datum
当我试图解决这个问题时,我发现了一些非常非常非常奇怪的事情。
在我开始之前,这里有两个代码:
第一个:
#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;
}
它们是完全相同的代码,除了 这两个代码的唯一区别是:
struct tm time; // first code
vs
tm time = {}; // second code
现在,这让我感到非常困惑。第一个代码和第二个代码在我的控制台上给出了完全相同的答案。我也通过执行 typeid(days[time.tm_wday]).name() 检查了结果的类型 (days[time.tm_wday]),两个答案似乎完全相同。
但是提交到Kattis网站时,只接受第二个,不接受第一个。
现在,谁能告诉我我在这里缺少什么?为什么它只接受一个对另一个?非常感谢!
编辑: 关于 Kattis 的一些信息: 会有一个问题,你必须通过编程来解决它。然后它会检查你的答案和他们的答案。如果您的程序输出相同的答案,它 "accepts" 您的解决方案。如果不同,则不同。
例如,假设问题是计算正方形的面积。它给出了几个带有值的例子。
ex) 案例 1:(输入:5 输出:25)。
如果您的控制台在输入 5 时输出 25,那么它 "accepts" 您的解决方案。如果它输出一些随机数,如 10,则它不接受。
我的程序的问题是它输出完全相同的值:
第一个代码输出:星期四。第二个代码输出:星期四等 但是只有一个被认为是 "correct".
有两个区别在起作用:
struct tm time; // (1)
对比
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
。由于tm
是a POD,所以没有初始化。使用未初始化的值通常会导致未定义的行为。
(2)
定义 并列表初始化 类型 tm
的变量 time
。这反过来 零初始化 tm
并且程序的行为是明确定义的。
更多相关信息:What do the following phrases mean in C++: zero-, default- and value-initialization?
为什么重要?
未完全初始化 time
然后调用 mktime(&time);
导致 未定义的行为 。一切都可能发生。每次你 运行 你的程序可能会有所不同,它可能取决于所使用的确切编译器,它所链接的库,OS,硬件,任何东西,一切。它也可以按预期工作。更多相关信息:Undefined, unspecified and implementation-defined behavior.
我怀疑该程序偶然在您的环境中运行,但在目标上失败。