为什么C有这么多不同的类型?

dul*_*shi 5 c type-conversion

我写了一个简单的计时器函数来计算start和之间经过的时间end

double mytimer(struct timeval *start, struct timeval *end)
{
    return (end->tv_sec - start->tv_sec) + (end->tv_usec - start->tv_usec)*1e-6;
}  
Run Code Online (Sandbox Code Playgroud)

gcc给出以下警告:

警告:从'__suseconds_t'转换为'double'可能会改变其值
警告:从'__time_t'转换为'double'可能会改变其值

以下是timeval的定义:

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么C定义了这么多不兼容的类型而不是简单地使用原始类型如int short...?它根本不是用户友好的.
我如何对这些类型进行算术运算?

更新

大多数人似乎忽略了我的第二个问题.什么是添加两种不同的类型,如标准的方式time_tsuseconds_t

Lun*_*din 7

因为time_t包含的内容是实现定义的,所以没有什么可以说它们应该包含一个整数秒,就像代码中的注释所暗示的那样.原因是他们希望这些类型在不同系统之间可移植.

在实践中,time.h确实相当麻烦,因此大多数时候程序最终会调用系统特定的功能.

  • 你会怎么写mytimer()来消除警告? (2认同)

Ric*_*ges 4

正如 Buttiful Butterfly 正确指出的那样,C++ 语言和标准库设计的目的是在编译时强制逻辑正确性。

这意味着我们的目标是这样一种情况:在某些模糊的情况下会做错误事情的程序根本不会编译(或者会编译,但会警告您)。

这意味着您可以在软件在测试工具中运行之前修复这些逻辑错误,更不用说在客户面前了。

这样做的结果是,正确编写的 C++ 代码在运行时之前基本上可以被证明是“正确的”,这意味着您花在追踪晦涩错误上的时间要少得多。

C++ 的神奇之处在于,它能够实现这一令人难以置信的壮举,同时提供出色的效率和代码优化。

注意:“正确”是指它会可靠地执行您认为您告诉它执行的操作。仍然由您来编写正确的逻辑!

关于问题:

所以我的问题是为什么 C 定义了这么多不兼容的类型而不是简单地使用诸如 int Short ... 之类的原始类型?它根本不方便用户使用。

它们不兼容是为了故意阻止您将它们相互转换。它们代表不同的概念,就像速度和距离是不同的概念一样。它们之间没有直接的转换。

如何对这些类型进行算术运算?

使算术的中间结果可以被这些类型安全地转换成,而不会损失精度。在这种情况下,tv_sec 和 tv_usec 是整型,因此即使它们彼此不兼容,它们都可以单独转换为 double。

例如:

double mytimer(struct timeval *start, struct timeval *end)
{
    return double(end->tv_sec - start->tv_sec) + 
           double(end->tv_usec - start->tv_usec) * 1e-6;
}
Run Code Online (Sandbox Code Playgroud)