C语言类型转换与错误处理
类型转换
基本概念
将一种数据类型转换为另一种数据类型称为类型转换。C语言支持两种类型转换方式:显式转换和隐式转换。
显式类型转换(强制转换)
使用强制转换运算符将值从一种类型显式转换为另一种类型:
c
(type_name) expression
示例:
c
#include <stdio.h>int main() {int sum = 17, count = 5;double mean;mean = (double) sum / count;printf("Value of mean : %f\n", mean);return 0; }
注意: 强制转换运算符的优先级高于除法运算符,因此sum
的值首先转换为double
类型,然后进行除法运算。
隐式类型转换
1. 整型提升
整型提升是将小于int
或unsigned int
的整数类型值转换为int
或unsigned int
的过程。
示例:
c
#include <stdio.h>int main() {int i = 17;char c = 'c'; // ASCII值为99int sum;sum = i + c;printf("Value of sum : %d\n", sum); // 输出116return 0; }
2. 通常的算术转换
编译器隐式执行算术转换,将操作数转换为共同的类型。转换规则如下:
首先执行整型提升
如果操作数类型仍不同,则转换为层次结构中出现的最高类型
示例:
c
#include <stdio.h>int main() {int i = 17;char c = 'c';float sum;sum = i + c;printf("Value of sum : %f\n", sum); // 输出116.000000return 0; }
错误处理
基本概念
C语言通过返回值提供错误处理支持。大多数函数在出现错误时返回-1或NULL,并设置全局错误代码errno
。
错误处理函数
errno, perror()和strerror()
perror()
: 显示字符串消息,后跟当前错误的文本描述strerror()
: 返回当前错误值的文本描述指针
示例:
c
#include <stdio.h> #include <errno.h> #include <string.h>extern int errno;int main() {FILE *pf;int errnum;pf = fopen("unexist.txt", "rb");if (pf == NULL) {errnum = errno;fprintf(stderr, "Value of errno: %d\n", errno);perror("Error printed by perror");fprintf(stderr, "Error opening file: %s\n", strerror(errnum));} else {fclose(pf);}return 0; }
输出:
text
Value of errno: 2 Error printed by perror: No such file or directory Error opening file: No such file or directory
常见错误处理场景
除以零错误处理
c
#include <stdio.h> #include <stdlib.h>int main() {int dividend = 20;int divisor = 0;int quotient;if(divisor == 0) {fprintf(stderr, "Division by zero! Exiting...\n");exit(-1);}quotient = dividend / divisor;fprintf(stderr, "Value of quotient : %d\n", quotient);return 0; }
程序退出状态
使用标准退出状态码可以提高代码的可读性和可维护性:
c
#include <stdio.h> #include <stdlib.h>int main() {int dividend = 20;int divisor = 5;int quotient;if(divisor == 0) {fprintf(stderr, "Division by zero! Exiting...\n");exit(EXIT_FAILURE); // 定义为-1}quotient = dividend / divisor;fprintf(stderr, "Value of quotient : %d\n", quotient);exit(EXIT_SUCCESS); // 定义为0 }
最佳实践
在程序初始化时将
errno
设置为0使用
stderr
文件流输出所有错误信息使用
EXIT_SUCCESS
和EXIT_FAILURE
提高代码可读性在可能出错的操作后检查返回值
使用强制转换运算符被认为是良好的编程习惯
通过合理运用类型转换和错误处理机制,可以编写出更加健壮、可维护的C语言程序。