关键字(四):goto和void

news2024/11/15 7:12:23

关键字

  • 一.具有争议的关键词—goto
  • 二.“空”的关键字—void
    • 1.void为什么不能定义变量
    • 2.void修饰函数返回值和参数
    • 3.void指针

在这里插入图片描述

一.具有争议的关键词—goto

goto语句非常灵活,其实就是从goto这个位置直接跳转到goto后面的那个数据(end)所对应的位置,对中间的代码进行跳过,直接读取下面的代码(end下面)

在这里插入图片描述

当然我们也可以向上跳转

在这里插入图片描述

但注意这里会出现死循环,因为首先从1开始向后打印,遇到goto再返回end所标记的位置,再向下打印,又遇到goto,再返回end所标记的位置,这样一直循环打印1,2,3,4,2,3,4,2,3,4

在这里插入图片描述

goto语句的基本使用

在这里插入图片描述

ps:goto语句只能在本代码块内使用,不能跨函数和文件,总体来说goto语句的使用很简单,但想要灵活使用只有不断练习

为什么goto语句颇具争议呢?

在这里插入图片描述

所以的确很多公司禁用goto语句,但有人使用goto语句吗?
当然有,并且用的人很多,甚至在Linux内核源代码里就充满了大量goto语句

在这里插入图片描述

大量的goto语句,数以几十万个

只能说目前公司的业务没达到Linux那么复杂,所以还没必要使用goto语句

二.“空”的关键字—void

1.void为什么不能定义变量

首先void是一种类型,像int ,char,long等都可以用来定义变量,那么void可不可以呢?

在这里插入图片描述

很显然是不能的,那既然是一种类型为什么不能用来定义变量呢?首先我们来看看void在vs中是否开辟了空间

在这里插入图片描述

从这里可以看出void在VS里是没有开辟空间的,那就很好理解了,因为定义一个变量是需要空间的,但void没有空间,当然不能用来定义变量。

但注意以上情况是在VS里,如果是在Linux环境里,又有什么不同呢?

在这里插入图片描述

可以看到在Linux环境里,void的大小是一个字节,但它依然不能用来定义变量。

在这里插入图片描述

所以综上:void不能用来定义变量不仅是因为它的空间大小不确定,更是因为void本身就被编译器定义为空类型,强制的不允许定义变量。(这是编译器的规定)

其实void的作用是来告诉编译器我是空类型,用来充当一些特殊作用

2.void修饰函数返回值和参数

场景一:void作为返回类型

在c语言中,函数返回可以不带类型,默认返回类型是int

在这里插入图片描述

所以理论上如果你想返回int类型的话可以不用写返回类型,但这里很容易给人带来误解,你到底是忘了写返回类型?还是不想返回?还是想返回int类型?所以还是建议写上返回类型

如果你不想有返回值,那么用void修饰

在这里插入图片描述

加上void,如果你准备接收,那么void就不能够通过(当然如果你不接收还是能通过的)

在这里插入图片描述

从上可以看出,加上void的好处就是不仅能告诉别人这里是不需要返回值的,而且编译器不允许你将这个数据保存起来,方便你发现错误(强制要求要写)

场景二:void作为参数

在这里插入图片描述

如果我们给函数的参数里放上void,再传参,那么还能不能通过呢?答案是可以的,但会出现一个警告(在Linux里会直接报错)

在这里插入图片描述

如果参数里不加void,就不会出现这条警告

在这里插入图片描述

这条警告就说明编译器已经意识到你在进行一个错误的操作,可以对你进行提醒同时这个void也可以提醒别人这个函数不需要参数(不做强制要求)

3.void指针

上文说到void不能用来定义变量,那么void * 可不可以用来定义变量呢?

在这里插入图片描述

答案是可以的,这是因为指针本身就会开辟空间,不论是什么类型指针,在32位机器里都占4个字节,故可以用来定义变量(如果对指针还不了解可以看看这篇博客 什么是指针)

void * 的性质一

在这里插入图片描述

从以上代码中我们可以看到x,y是不同的类型,按理说不同的类型是不能直接赋值的,那我们这样写会不会报错呢?

在这里插入图片描述

答案是不会并且连警告都没有。故我们得出一个结论:void*类型可以被任何指针类型所接受

接下来我们反过来尝试,将不同类型指针赋值给void*类型

在这里插入图片描述

这里也不会出现任何问题,我们又可以得出一个结论:void*可以接收任何指针类型(常用)

至此,总结一下:void*既可以赋值给任意指针类型,也可以接收任何指针类型

void性质二

在指针变量中我们是可以直接对变量进行++或者–操作的

在这里插入图片描述

那么void*类型可不可以这样直接对变量进行操作呢?

在这里插入图片描述

答案是不行的(在VS中),为什么呢?因为对变量操作本质上是跳过指针的类型大小,例如int*p中,p++就是跳过一个整形(4个字节),而前文说到,void是没有开辟空间的,那么x++相当于跳过了0个字节,这样是毫无意义的,所以编译器报错

但注意前文我们说到,在Linux环境下void是一个字节,那么可不可以对void*x进行操作呢?答案是可以的。因为在Linux环境下void的大小是1个字节,那么x++就相当于跳过一个字节是有意义的,故可以通过

这里得出结论:在VS下,不能对空类型的变量进行直接操作;在Linux环境下可以对空类型的变量进行操作

为什么在VS和Linux下void的类型不同呢?

在这里插入图片描述

根本原因就是采用的c标准不同

性质三:void * 能直接解引用吗

在这里插入图片描述

答案是不行的。因为解引用(*x)对于的是指针所指向的类型,所以 *x所对应的类型是void,而在VS中,void是没有空间的,所以我们无法用void来解释这一段数据

在Linux环境里也不能解引用,虽然在Linux中void有一个字节,但前面我们说过void是不能用来定义变量的,而解引用后*x对应的类型就是void,发生矛盾

得出结论:在c语言中不能对void*进行解引用

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电力系统短期负荷预测(Python代码+数据+详细文章讲解)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

整理 MySQL 常用函数,小伙伴们在也不发愁了

前言 为了简化操作,MySQL 提供了大量的函数,会对传递进来的参数进行处理,并返回一个处理结果,也就是返回一个值。MySQL 包含了大量并且丰富的函数,这里只是对 MySQL 常用函数进行简单的分类,大概包括数值型…

网站域名备案查询方法,批量查询网站域名备案的教程

网站域名备案查询方法,批量查询网站域名备案的教程 批量查域名备案操作步骤: 第一步、打开SEO综合查询工具。 第二步、添加需要查询的网站域名(要查多少放多少,一行一个域名)。 第三步、勾选域名ICP备案。 第四步、点击开始查询…

python带你体验唯美雪景,愿这个冬天的你,不缺暖阳

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 大雪已至,冬天无恙,愿这个冬天的你,不缺暖阳,好日常在 一、画一朵小雪花 import turtle import time from turtle import * # codingutf-8def sno…

%00截断

%00截断 CVE-2013-4547 影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7 影响说明:绕过服务器策略,上传webshell 环境说明:Nginx 1.4.2 /test.jpg%00.php该漏洞利用了Nginx错误的解析了URL地址,导致可以绕过服务端限…

Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换

本文介绍在C 语言中,矩阵库Armadillo的mat、vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法。 在C 语言的矩阵库Armadillo与计算机视觉库OpenCV中,都有矩阵格式的数据类型;而这两个库在运行能力方面各有千秋,因此实…

shiro-spring-boot-starter

第2.1.7章 WEB系统最佳实践Spring文件配置之spring-shiro.xml 2016年还在使用shiro,后来使用应用springboot之后,因为有了网关,感觉网关就可以做一些拦截,就没必要一定要使用shiro,如果你使用平台还需要每个系统自己做…

小白学编程(Java)20:判断一个数是否是质数

解题思路: 第一步:弄明白质数是什么? 质数的定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数&am…

微信公众号开发——获取AccessToken接口调用凭据

😊 作者: 一恍过去💖 主页: https://blog.csdn.net/zhuocailing3390🎊 社区: Java技术栈交流🎉 主题: 微信公众号开发——获取AccessToken接口调用凭据⏱️ 创作时间&#xff1…

Typora的使用

一.标题:六级标题 1 .一级标题 2. 二级标题 二级标题 : ## 加一个空格 现在加 ## 空格 然后我们把光标放在其他地方 点击一下 3 层级列表 层级列表: > 空格 回车 在这一部分,我们先来讲解三个概念&#xff1a…

基于java+springboot+mybatis+vue+mysql的篮球竞赛预约平台

项目介绍 随着人们生活质量提高,越来越多的年轻人喜欢足球。尤其是在高校之中,每年都会举办一些足球和篮球比赛。甚至在国际上每年也都会有一足球和篮球联赛。很多高校为了提高学生的身体素质每年也都会举办一些篮球竞赛,为了让这些篮球爱好…

计算机毕业设计ssm+vue基本微信小程序的奶茶点单系统

随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受客户的喜爱,随便点奶茶点单小程序被客户普遍使用,为方便客户能够…

《发现心流》

关于作者 米哈里•契克森米哈赖,任教于美国加州克 菜蒙特大学,提出并发展了心流理论。他 一直在关注人类的积极心理体验,完成了 大量经典的研究工作,是该领域最权威的 学者之一,被誉为积极心理学的世界级领 军人物。 …

日期与时间

目录 一、基本概念 1.1、日期和时间 1.2、本地时间 1.3、时区 1.4、夏令时 1.5、本地化 二、Date 和 Calendar 2.1、Date 2.2、Calendar 三、TimeZone 四、LocalDateTime 4.1、LocalDateTime 4.2、Duration和Period 五、ZoneDateTime 5.1、创建实例 5.2、时区转…

电子学会2020年12月青少年软件编程(图形化)等级考试试卷(一级)答案解析

目录 一、单选题(共25题,每题2分,共50分) 二、判断题(共10题,每题2分,共20分) 三、编程题【该题由测评师线下评分】(共2题,共30分) 青少年软件…

【MySQL数据库】索引到底是什么,怎么创建索引的效率最高

面试官:我看你简历上写了MySQL,对MySQL InnoDB引擎的索引了解吗? 候选者:嗯啊,使用索引可以加快查询速度,其实上就是将无序的数据变成有序(有序就能加快检索速度) 候选者&#xff…

微服务守护神-Sentinel-其他

引言 书接上篇 微服务守护神-Sentinel-热点-授权-系统规则 ,上面介绍了Sentinel热点、授权、系统规则,本篇继续来Sentinel 剩下其他操作 自定义异常返回 当触发sentinel流控规则之后, sentinel就干巴巴返回异常信息,单纯的文字…

JVM监控及诊断工具

本文目录命令行jps 查看正在运行的Java进程jstat:查看JVM统计信息jinfo:实时查看和修改JVM配置参数jmap:导出内存映像文件&内存使用情况jhat:JDK自带堆分析工具jstack:打印JVM中线程快照jcmd:多功能命令…

docker、LXC、LXD的区别及传统的虚拟机与操作系统虚拟化的区别

1. 概念解释 1.1. Docker Docker是一个用于在集中式平台上创建、部署和运行应用程序的开源工具。这使得主机的操作系统通过容器运行具有相同Linux内核的应用程序,而不是创建一个完整的虚拟机。使用docker容器不需要考虑Ram和磁盘空间的分配。它能够自己处理这些需…

CopyOnWriteArrayList源码解析

CopyOnWriteArrayList源码解析 简介 我们知道 ArrayList 是线程不安全的,其存在一个古老的线程安全的 Vector,但是由于 Vector 效率太低 (方法都加了synchronzed),在 JDK1.5 时 Doug Lea 提供了一个效率较高的线程安全的 CopyOnWriteArrayL…