c - Int32 到 Epoch 到可读数据?![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(unsigned __int32 timeH)
{
struct tm newtime;
newtime = timeH;
printf("%s\n", asctime(newtime));
}
解决方案
您的非工作版本尝试将数字类型的值分配给 type 的对象struct tm
:
struct tm newtime;
newtime = timeH;
没有为此类分配定义任何行为,并且除了完全拒绝代码之外,还不清楚可以预期什么行为。当它确实拒绝该代码时,您的编译器肯定会发出一个诊断信息,说明它之所以这样做是因为运算符的操作数不兼容=
。
您的非工作版本还尝试将类型参数传递struct tm
给 function asctime()
,它需要一个指向这种结构的指针:
printf("%s\n", asctime(newtime));
结构和指向它们的指针不可互换。您的编译器也可能会对此进行诊断,发出一条或多条关于不兼容类型的附加错误消息。
现在让我们考虑工作版本。我首先注意到,newtime
在该版本中,局部变量的声明方式不同,作为指向 a的指针struct tm
:
struct tm *newtime;
这就解决了上面的第二个问题。我还注意到这struct tm *
也是函数返回的类型localtime()
,因此将该函数的结果分配给它newtime
是非常好的。
从那里,我们观察到参数localtime
必须有类型time_t *
,这正是表达式的类型&long_time
,因为它long_time
本身是一个time_t
。
因此,我看到的唯一可能的混淆点围绕着timeH
, an unsigned __int32
, 到 variable的分配long_time
。然而,除非发生了一些令人讨厌的混淆,否则它unsigned __int32
是一个整数类型。此外,该标准告诉我们,这time_t
是“能够代表时间的真实 [类型]”(C2011,第 7.27.1/3 段)。在这种情况下,“真实”具有基于该术语的数学用法的含义;总的来说,它time_t
是一种没有虚部的数字类型——即它可以表示的值是实数的子集。
没有具体说明什么类型time_t
,但 C 广泛允许在不同数字类型之间进行赋值,几乎没有警告或限制。因此,即使我们不知道确切的类型time_t
是什么,也没有什么特别的理由可以假设分配是无效的。作为实现的质量问题,赋值是保值的也就不足为奇了(这在实践中通过函数起作用的事实得到证明)。
推荐阅读
- python - 服务层中的 Python Flask 事务控制
- python - 基于系列的布尔值删除数据帧索引
- c++ - 继承构造函数的字符和访问级别
- c++ - 如何获取网格的外边缘(仅属于一个三角形的边缘)
- java - 修改同步块中的对象(例如 HashSet)是否等同于使其成为同步对象?
- python - 有没有更简单的方法来抓取 br 标签?
- javascript - 是否有任何用于网络摄像头的人脸 AR SDK 或图像处理 SDK?
- python - 让 Visual Studio 和 python 加载 conda 模块的问题
- javascript - 如何使我的 JavaScript 搜索高级?
- r - 条件配对 t 检验