服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言详细分析讲解关键字goto与void的作用

C语言详细分析讲解关键字goto与void的作用

2022-11-12 16:53清风自在 流水潺潺 C/C++

我们在C语言中经常会见到void,也会偶尔见到goto,那么C语言中既然有goto,为什么我们在代码中见的很少呢?在以前很多的项目经验中,我们得到这样一条潜规则:一般项目都是禁用goto的,程序质量与goto的出现次数成反比。自后也

一、关于goto

  • 高手潜规则:禁用 goto
  • 项目经验:程序质量与 goto 的出现次数成反比
  • 最后的判决:将 goto 打入冷宫

下面看一段 goto 副作用分析的代码:

#include <stdio.h>
#include <malloc.h>
void func(int n)
{
  int* p = NULL;

  if(  n < 0 )
  {
      goto STATUS;
  }
  p = (int*)malloc(sizeof(int) * n);
  
STATUS:
  p[0] = n;    
  
  free(p);
}

int main()
{  
  printf("begin...\n");
  
  printf("func(1)\n");
  
  func(1);
  
  printf("func(-1)\n");
  
  func(-1);
  
  printf("end...\n");
  
  return 0;
}

下面为输出结果:

C语言详细分析讲解关键字goto与void的作用

这段代码中当 func 的入口参数 n 的值小于 0 时,就会 goto 到STATUS 那里去执行代码,但是由于跳过了分配内存环节,就不能把 n 的值赋给 p[0],强行赋值就会发成段错误。

 

二、void 的意义

void 修饰函数返回值和参数

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

void 修饰函数返回值和参数是为了表示“无”

下面这段代码就表示 f 函数的输入参数没有限制。

C语言详细分析讲解关键字goto与void的作用

不存在 void 变量

  • C语言没有定义 void 究竟是多大内存的别名
  • 没有 void 的标尺
  • 无法在内存中裁剪出 void 对应的变量

在下面的代码中,只有 void* 那条语句可以编译通过,因为 void* 指针是合法的。

C语言详细分析讲解关键字goto与void的作用

小贴士

  • ANSI C:标准 C 语言的规范
  • 扩展C:在 ANSI C 的基础上进行了扩充

C语言详细分析讲解关键字goto与void的作用

上面的代码在 ASNI C编译器中无法通过编译,但是对于支持 GNU 标准的 gcc 编译器而言是合法的。

void 指针的意义

  • C 语言规定只有相同类型的指针才可以相互赋值
  • void* 指针作为左值用于“接收”任意类型的指针
  • void* 指针作为右值使用时需要进行强制类型转换

C语言详细分析讲解关键字goto与void的作用

下面看一段通过 void* 实现 MemSet 函数的代码:

#include <stdio.h>
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语言详细分析讲解关键字goto与void的作用

void* 定义的 src 表示可以接收任意类型的指针,所以数组 a 可以是任意类型。

 

三、小结

  • 现代软件工程中禁用 goto 语句
  • void 是一种抽象的数据类型
  • void 类型不能用于定义变量
  • void 类型用于声明函数无参数
  • void 类型用于声明函数无返回值
  • 可以定义 void* 类型的指针
  • void* 类型的指针可以接受任意类型的指针值

到此这篇关于C语言详细分析讲解关键字goto与void的作用的文章就介绍到这了,更多相关C语言goto与void内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43129713/article/details/123240243

延伸 · 阅读

精彩推荐
  • C/C++VC基于ADO技术访问数据库的方法

    VC基于ADO技术访问数据库的方法

    这篇文章主要介绍了VC基于ADO技术访问数据库的方法,较为详细的分析了VC使用ADO操作数据库的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    weiren20065002021-03-15
  • C/C++深度剖析C语言结构体

    深度剖析C语言结构体

    今天小编就为大家分享一篇关于深度剖析C语言结构体,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    Engineer-Bruce_Yang9622021-07-13
  • C/C++C++ 的类型转换详解

    C++ 的类型转换详解

    本篇文章是对C++ 类型转换的详细介绍,需要的朋友参考下,小编觉得这篇文章写的不错,希望能够给你带来帮助...

    ALL IN C8992022-02-17
  • C/C++Qt数据库应用之实现通用数据库分页

    Qt数据库应用之实现通用数据库分页

    数据库分页展示,在所有的涉及到数据库记录的项目中都是需要的。本文将利用Qt实现通用数据库的分页展示,感兴趣的小伙伴可以跟随小编学习一下...

    feiyangqingyun9502022-10-09
  • C/C++在C++中实现aligned_malloc的方法

    在C++中实现aligned_malloc的方法

    这篇文章主要介绍了在C++中实现aligned_malloc的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    老胡写代码11862021-10-27
  • C/C++C语言实现加密解密功能

    C语言实现加密解密功能

    这篇文章主要为大家详细介绍了C语言实现加密解密功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Ibelievesunshine12512021-08-19
  • C/C++opencv实现图像颜色空间转换

    opencv实现图像颜色空间转换

    这篇文章主要为大家详细介绍了opencv实现图像颜色空间转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    UESTC_C2_4035522021-08-01
  • C/C++C++通过类实现线性表

    C++通过类实现线性表

    这篇文章主要为大家详细介绍了C++通过类实现线性表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    wwxy2617692021-09-07