类型转换
类型转换
类型转换是一种使一个类型的变量(例如 int)在单个操作中表现得像另一种类型(例如 char)的方法。要进行类型转换,只需将实际变量要充当的变量类型放在实际变量前面的括号中即可。(char)a 会使'a'表现得像 char。
例如:
#include <stdio.h>
int main()
{
/* (char)是类型强制转换,告诉计算机将65解释为字符,而不是数字。
它将给出相当于数字65的字符输出(对于ASCII应该是字母A)。
注意%c是打印单个字符的转换说明符
*/
printf( "%c\n", (char)65 );
getchar();
}类型转换的一个用途是当你想要使用 ASCII 字符时。例如,如果你想要创建一个包含所有 128 个 ASCII 字符的自己的图表,你需要使用类型转换来允许你将整数打印为其字符等效值。
#include <stdio.h>
int main()
{
for ( int x = 0; x < 128; x++ ) {
/* 注意,使用int版本的x来输出一个数字,
* 并使用(char)将x类型转换为一个字符,
*该字符输出与当前数字对应的ASCII字符
*/
printf( "%d = %c\n", x, (char)x );
}
getchar();
}如果你仔细观察,可能会注意到一些奇怪的地方:当我们把 x 的值作为 char 传递给 printf 时,我们已经在格式字符串中用%c 告诉编译器我们打算将值视为字符。由于 char 类型只是一个小的整数,添加这种类型转换实际上并没有增加任何价值!
那么什么时候类型转换会派上用场呢?类型转换的一个用途是强制执行正确的数学运算。结果在 C(以及其他编程语言)中,整数的除法结果是整数本身:例如,3/5 变成 0!为什么?因为 3/5 小于 1,而整数除法会忽略余数。
另一方面,事实证明,浮点数之间的除法,甚至一个浮点数和一个整数之间的除法,足以保持结果为浮点数。所以如果我们正在进行某种不需要截断值的复杂除法,我们就必须将其中一个变量转换为浮点类型。例如,(float)3/5 得到的结果是 0.6,正如你所期望的那样!
这种情况下可能会出现什么问题?通常来说,将两个值存储在整数中是合理的。例如,如果你在跟踪心脏病患者,你可能会有一个函数来计算他们的年龄(以年为单位)以及他们因心脏疼痛就诊的次数。你可能想要执行的一个操作是计算某人在每年生活中因心脏疼痛就诊的次数。这会是什么样子?
/* 函数返回以年为单位的年龄 */
int age = getAge();
/* 函数返回访问次数 */
int pain_visits = getVisits();
float visits_per_year = pain_visits / age;问题是,当这个程序运行时,visits_per_year 将会是零,除非患者去了很多次医生那里。解决这个问题的方法是将被除数中的一个值转换为浮点数,这样编译器就会将表达式视为结果为浮点数:
float visits_per_year = pain_visits / (float)age;
/* 或 */
float visits_per_year = (float)pain_visits / age;这样就会将正确的值存储在 visits_per_year 中。你能想到解决这个问题(在这种情况下)的另一种方法吗?
