关于c:C进阶8goto和void分析

50次阅读

共计 1759 个字符,预计需要花费 5 分钟才能阅读完成。

Summary

1)个别工程开发中须要 禁用 goto 语句,不同的编译器对 goto 语句的错误处理可能不同。

2)在 C 语言中,如果函数没写返回值,则 默认返回值类型是 int;如果函数没有写参数列表,则函数 承受任意数量的参数
因而,如果函数没有返回值,必须显式申明返回值类型为 void;如果函数没有参数,则必须申明参数列表为 void。

3)void 是一种根底类型,但 不是根底数据类型 ,所以 无奈用来定义变量(C 语言没规定 void 是多大内存空间的别名)。

4)对于 规范 C 语言 标准,不容许 sizeof(void)这种写法,如 bcc 编译器;对于 扩大 C 语言 ,可能容许 sizeof(void) 这种写法,如 gcc 编译器,输入为 1。

5)void*指针的次要作用是:用于接管任意类型的指针 。在 C 语言中,void*type* 能够互相转换;在 C ++ 中,void*能够作为左值接管任意类型的指针,作为右值时,必须进行 强制类型转换

goto 和 void

1、goto

goto 语句带有很浓重的汇编语言个性,可能跳转到指定的语句,如同汇编语言的跳转指令。
在工程实际中,个别都 禁用“goto”。goto 会毁坏程序的构造,带来 意想不到的谬误

// 代码示例:以下代码输入什么?int main()
{
goto End;
    int i = 0;
End:
    printf("i = %d\n", i);
    return 0;
}
  • gcc 编译器:编译谬误error,提醒 i 变量的初始化被跳过了。
  • vs 编译器:编译正告warning,提醒 i 未初始化,然而编出了可执行程序。运行的后果是随机值,意料之外的谬误!

2、void

2.1 void 润饰返回值和参数

在 C 语言中:

  • 如果函数没有返回值,那么应该将其申明为 void
  • 如果函数没有参数,应该申明其参数为 void

留神,C 语言中:

  • 如果函数没写返回值,默认的返回值类型是 int
  • 如果函数没有申明参数列表,默认承受任意多参数

    f()
    {
    }
    
    int main()
    {int i = f(1, 2, 3);        // ok
    
      return 0;
    }

2.2 是否存在 void 类型的变量?

论断:不存在 void 类型的变量

void 是一种根底类型,但 不是根底数据类型;C 语言中没有定义 void 到底是多大内存的别名,所以也无奈定义对应的变量。

int main()
{
    void var;        // error
    void arr[5];     // error

    return 0;
}

小贴士:

  • ANSI C:规范 C 语言标准,如 bcc 编译器
  • 扩大 C :在 ANSI C 的根底上进行了扩大,如 gcc 编译器

    // void 类型有大小么?int main()
    {prinft("%d\n", sizeof(void));
      return 0;
    }
  • gcc 编译器,Demo 能够编过,输入为 1
  • bcc 编译器,编译谬误,提醒 void 是不容许的类型。

2.3 void 类型的指针

  • 在 C 语言中,对指针类型的查看不那么严格,所以 void 类型的指针 能够 和任意数据类型的指针进行 互相转换

    // test.c
    int main()
    {
      int* p = nullptr;
    
      void* pv = p;         // ok
      
      char* pc = pv;        // ok
      return 0;
    }
  • 在 C ++ 语言中,对 类型进行了加强 ,共事也兼容了 C 语言中的写法。void 能够作为左值承受任意类型的指针,然而 ,void 作为右值时,就必须进行 强制类型转换

    // test.cpp
    
    int main()
    {
      void* pv = nullptr;        // 初始化是个好习惯
      
      int* pi = pv;          // error, invalid conversion from void* to int*
      int* pi = (int*)pv;    // ok, due to cast
    
      return 0;
    }

总结:void* 指针的次要作用是,用于接管任意类型的指针
示例 Demo:将数组所占内存全副置 0

void MemSet(void* src, int length, unsigned char n)
{unsigned char* p = (unsigned char*)src;
    int i = 0;
    for(i=0; i<length; i++)
    {p[i] = n;
    }
}

int main()
{int a[5];
    int i = 0;

    MemSet(a, sizeof(a), 0);

    for(i=0; i<5; i++)
    {printf("%d\n", a[i]);
    }

    return 0;
}

本文总结自“狄泰软件学院”唐佐林老师《C 语言进阶课程》。
如有错漏之处,恳请斧正。

正文完
 0