C Int32到历元到可读数据?![丙]
好的,我这里有一个函数,它确实起作用,但我不明白 为什么它是这样工作的:C Int32到历元到可读数据?![丙],c,C,好的,我这里有一个函数,它确实起作用,但我不明白 为什么它是这样工作的: void timeToData(unsigned __int32 timeH) { struct tm *newtime; time_t long_time = timeH; newtime = localtime(&long_time); printf("%s\n", asctime(newtime)); } 不是这样吗 void timeToData(unsigne
void timeToData(unsigned __int32 timeH)
{
struct tm *newtime;
time_t long_time = timeH;
newtime = localtime(&long_time);
printf("%s\n", asctime(newtime));
}
不是这样吗
void timeToData(unsigned __int32 timeH)
{
struct tm newtime;
newtime = timeH;
printf("%s\n", asctime(newtime));
}
非工作版本尝试将数值类型的值分配给类型为
struct tm
的对象:
struct tm newtime;
newtime = timeH;
struct tm *newtime;
没有为这样的赋值定义任何行为,除了完全拒绝代码之外,还不清楚预期的行为是什么。当它拒绝该代码时,您的编译器肯定会发出一个诊断,说明它拒绝该代码是因为=
运算符的操作数不兼容
您的非工作版本还尝试将类型为struct tm
的参数传递给函数asctime()
,该函数需要指向此类结构的指针:
printf("%s\n", asctime(newtime));
结构和指向它们的指针是不可互换的。编译器也可能会对此进行诊断,并发出一条或多条关于不兼容类型的附加错误消息
现在让我们考虑一下工作版本。我首先注意到局部变量newtime
在该版本中的声明不同,它是指向struct tm
的指针:
struct tm newtime;
newtime = timeH;
struct tm *newtime;
这就解决了上面的第二个问题。我还注意到,struct tm*
也是localtime()
函数返回的类型,因此将该函数的结果赋值给该newtime
非常好
从这里,我们观察到,localtime
的参数必须具有类型time\t*
,这正是表达式&long\u-time
的类型,因为long\u-time
本身就是一个time\t
因此,我所看到的唯一剩下的可能混淆点围绕着timeH
的赋值,一个无符号的int32
,到变量long\u time
。然而,除非发生了令人讨厌的混淆,unsigned\u int32
是一种整数类型。此外,该标准告诉我们,time\u t
是一种“能够表示时间的真实[类型]”(C2011,)。在这种情况下,“真实”的含义基于该术语的数学用法;总的来说,time\u t
是一种没有虚部的数字类型,也就是说,它可以表示的值构成实数的子集
没有指定时间的确切类型,但C广泛地允许在不同的数字类型之间赋值,很少有警告或限制。因此,即使我们不知道确切的
time\u t
是什么类型,也没有特别的理由认为赋值是无效的。作为一个实现质量问题,赋值是保值的(这在实践中通过函数工作的事实得到证明)并不奇怪。请参阅相关问题,在这种情况下,这可能很有用。函数的哪些方面让您感到困惑或惊讶?您需要了解的所有信息都可以在此处找到: