C语言学习之路--第十六站 强制类型转换 与 错误处理 以及 递归

49 阅读2分钟

类型转化

在学习的编程语言中都涉及到了类型的转换。其中有隐式转换,也有强制转换。转换规则如下:

image.png

可以简化理解为:

image.png

强制转换优先级要高于加减乘除。

从下向上转化是隐式转化,自动完成。

从上向下需要强制转化 例如: (double) sum


错误处理

C语言中不提供对错误处理的直接支持,但是作为一种编程语言,它以返回值的形式允许访问底层数据。在发生错误时,大多数的C或UNIX函数调用返回 1 或 NULL , 同时会设置一个错误代码 errno , 该错误代码是全局变量,表示函数调用发生错误。再 errno.h 头文件中可以找到各种错误代码。

因此通过检查返回值,然后根据返回值决定采取哪种方式。开发人员应该在程序初始化的时候将 errno 设置为0,这是一个良好的编程习惯,0 代表程序没有错误。

C提供了 perror()strerror() 函数可以显示与 errno 相关的文本消息。

  • perror() 函数显示传给它的字符串,后跟一个冒号,一个空格,和当前 errno 值得文本表示形式
  • strerror()函数返回一个指针,指向当前 errno 值的文本表达式。
  • 同时需要注意应该使用 stderr 文件流输出所有错误

在错误测试时出现有问题,在错误的情况下程序无法像教程一样出现,因此贴上菜鸟教程的内容。

image.png


递归

有一定的基础,因此对递归的理解比较容易。但是还是学习到了一些知识。

  • 每调用一个函数就会使用一层栈,而递归多次调用函数,因此会使用多层栈,容易造成暴空间。
  • 递归,一层一层调用一层一层返回,会使用更多的时间。
  • 能使用递推算法就最好不要用递归算法。尽管递归的代码会更加的简洁。
  • 搜索与回溯算法,广度优先搜索算法,分治(二分) 都用到了递归。

阶乘递归方法:

#include <stdio.h>

double factorial(unsigned int i)
{
   if(i <= 1)
   {
      return 1;
   }
   return i * factorial(i - 1);
}
int  main()
{
    int i = 15;
    printf("%d 的阶乘为 %f\n", i, factorial(i));
    return 0;
}

斐波那契数列

#include <stdio.h>

int fibonaci(int i)
{
   if(i == 0)
   {
      return 0;
   }
   if(i == 1)
   {
      return 1;
   }
   return fibonaci(i-1) + fibonaci(i-2);
}

int  main()
{
    int i;
    for (i = 0; i < 10; i++)
    {
       printf("%d\t\n", fibonaci(i));
    }
    return 0;
}