C语言运算符、表达式及类型转换深度解析
1. 函数名重载问题
在C语言里,无法像其他语言那样实现函数名重载,即不能使用相同的函数名但不同的参数和返回类型。因为在C语言中,函数仅通过名称调用,没有其他区分函数调用的方式。比如,一个具有特定类型和两个参数的函数,无法与同名但类型不同且无参数的函数区分开来。
我们或许会尝试把类型名嵌入函数名,例如 fahrenheithDblToCelsiusInt()
和 celsiusIntToCelsiusDbl()
,但为所有数据类型声明和定义这样的函数名极为繁琐,而且在程序中使用也非常困难。在大型或复杂程序里,由于函数名拼写错误甚至调用参数拼写错误而导致的编译器错误很可能出现,并且排查起来会很耗时。
2. 数字运算的特殊问题
在进行任何数字计算时,必须考虑输入和输出的可能范围。每种数字类型都有其最大值和最小值的限制,这些限制在C标准库的 limits.h
头文件中针对每个系统进行了定义。
作为程序员,要确保任何算术运算的结果在指定数据类型的范围之内,或者程序要检查输入的有效性,从而避免无效输出。无效输出有四种类型:非数字(NaN)、无穷大(Inf)、下溢和上溢。
2.1 理解NaN和Inf
NaN和Inf输出可能在对浮点数进行运算时出现。NaN有两种类型,一种是静默型,允许计算继续进行;另一种会引发异常。异常发生时的具体情况取决于C语言的实现,可能继续执行、终止程序或执行其他操作。
当运算结果是未定义或无法表示的数字时,会产生NaN结果。当运算结果