关键词(四)

news2024/9/23 17:13:25

关键词(四)

  • 一.具有争议的关键词—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/79258.html

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

相关文章

单例模式、工厂模式

单例模式、一、单例模式1.1 饿汉模式1.1.1 实现1.1.2 补充1.2 懒汉模式1.2.1 单线程版1.2.2 多线程版二、工厂模式一、单例模式 单例模式是校招中最常考的设计模式之一。 啥是设计模式? 设计模式好比象棋中的"棋谱":红方当头炮,黑…

软件测试人员究竟要掌握什么技能?顺便说下行业现状

最近团队内部产品在做性能测试中碰到一个问题,不仅仅这次性能测试,其实这在我这近10年工作过程中,经常碰到一些类似的事情,今天拿出来一件事说叨说叨。 1、事情经过 月中上线了一个功能,该功能会应对峰值流量&#x…

【安卓APP源码和设计报告(含PPT)——订餐系统

订餐系统实验报告 课程名称: Android程序设计 班 级: 学 号: 姓 名: 任课教师: 程序功能与环境(服务器,手机实物照片,自己拍) 程序功能 餐厅订餐系统服务器&#…

45. python %占位符格式化处理

45. %占位符格式化处理 文章目录45. %占位符格式化处理1.课题导入2. %占位符概念3. %d格式化为整数3.1 %d将整数格式化到指定位置3.2 %d将浮点数格式化为整数1. 知识回顾:用int函数将浮点数转换为整数2. 用%将浮点数格式化为整数4. %s格式化为字符串4.1 %s将整数格式…

论文笔记-时序预测-Triformer

论文标题: Triformer: Triangular, Variable-Specific Attentions for Long Sequence Multivariate Time Series Forecasting 论文链接: https://arxiv.org/abs/2204.13767v1 代码链接: https://github.com/razvanc92/triformer 摘要 各种现…

[附源码]计算机毕业设计基于JEE平台springbt技术的订餐系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Spring源码解析-环境变量

“不积跬步,无以至千里”。 今天聊一聊Spring中环境变量的动态添加和填充Bean属性的时候一些带“$”符号的属性值的解析问题。 因为最近做项目的时候发现了一个有意思的问题,之前也没关注过。因为项目中使用的容器类型是GenericXmlApplicationContext&a…

从GPT-3到CHAT-GPT(CHAT-GPT如何申请)

回顾2020年7月 2020年7月份有一个重大新闻,人工智能科研公司OpenAI,推出了它的新一代语言模型 GPT-3(Generative Pretrained Transformer 3),这个事情在社交媒体影响甚广,甚至有一篇文章《一个新型 AI 震惊…

动态代理详解

目录 一、动态代理_代理模式简介 二、动态代理_JDK动态代理 dynamic 三、动态代理_CGLib动态代理 四、JDK和CGLib动态代理的区别 一、动态代理_代理模式简介 代理模式是23种设计模式之一。设计模式是前人总结的,在软件开发过程遇到常用问题的解决方案&#xff0…

微服务框架 SpringCloud微服务架构 微服务保护 30 初识Sentinel 30.4 引入cloud-demo

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护30 初识Sentinel30.4 引入cloud-demo30.4.1 引入cloud-demo30.4.2 微服务整合Sentinel30 初识Sent…

尝试使用CubeMX做stm32开发之十三:Clock Configuration(时钟树配置)

参考《STM32中文参考手册_V10》,研究CubeMX中有关时钟树配置。 一、系统时钟配置 三种不同的时钟源可被用于驱动系统时钟(SYSCLK): HSI振荡器时钟HSE振荡器时钟PLL时钟 时钟源选择对应时钟配置寄存器(RCC_CFGR&…

Android -- 每日一问:修改 SharedPreferences 后两种提交方式有什么区别?

知识点 SharedPreferences 类是一个接口类,真正的实现类是 SharedPreferencesImpl 。修改 SharedPreferences 需要获取它的 Editor,在对Editor进行put操作后,最后通过 commit 或者 apply 提交修改到内存和文件。当然有了两种都可以提交的方法…

Java进程线程介绍创建和执行销毁并理解线程安全和线程池 Native Method

目录1.进程和线程2.多线程的核心3.操作系统的多任务--以非常小的时间间隔交替执行4.native 修饰的方法5.Thread创建线程的两种方式1.普遍采用实现Runnable接口的方式2.继承Thread方式6.自定义线程用 new Thread(Runnable target) 启动源码分析6.1-new Thread(myThread)6.2对实例…

mysql8.0.21安装配置方法图文教程

记录了mysql 8.0.21 的安装配置方法,分享给大家。 一、下载 1、下载安装包 mysql下载路径 2、解压压缩包 3、在此目录下新建my.ini配置文件 [mysqld] # 设置 3306 端口 port3306 # 设置 mysql 的安装目录 basedirD:\mysql-8.0.21-winx64 # 设置 mysql 数据…

破案了!不会讲笑话不会作诗的chatGPT!

热出圈的chatGPT, 必须亲手试试热出圈的chatGPT, 必须亲手试试1 猜猜我是谁2 问网传图片李白风格注释代码3 写个程序看看4 帮我猜猜世界杯(发了发了,偷笑脸)5 知道李白吗?6 那你会写诗吗?6 那你讲脑经急转弯吗&#xf…

linux服务器安装docker(学习中)

linux服务器安装docker1、docker官网寻找官方文档1.1、卸载之前的docker1.2、安装yum工具类1.3、配置docker下载源的地址1.4、安装最新稳定版的docker1.5、启动docker1.6、docker镜像下载加速2、docker-卷-映射和挂载2.1、nginx1、docker官网寻找官方文档 然后根据官网文档进行…

高性能零售IT系统的建设08-9年来在互联网零售O2O行业抗黑产、薅羊毛实战记录及打法

前言 2012年左右转入互联网应用,由于本身在学校时就涉足过远程医疗影像中的DICOM安全领域这块,因此也是机缘巧合我进入互联网第一年就遇上了一次亿级的DDOS攻击以及千万级CC攻击短信系统的对抗。那时在公司一战成名,直接从team leader升到了主…

adb remount原理

1, 输入"fastboot flashing unlock" in adb ,waiting for the device 2, 输入"fastboot flashing unlock_critical"in adb ,waiting for the device 3, 输入"fastboot reboot" reboot the stb, press any key entering the boot mode 4, after…

tensorflow入门(三)tensorflow下神经网络参数的设置

参考 Tensorflow入门 - 云社区 - 腾讯云 神经网络中的参数是神经网络实现分类或回归问题中重要的部分。在tensorflow中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数的。在tensorflow中,变量(tf.Variable)的作用就是保存和更新神经网络的参…

Educational Codeforces Round 123 (Rated for Div. 2) D. Cross Coloring

Problem - D - Codeforces 翻译: 有一张纸,可以用大小为𝑛𝑚:𝑛行和𝑚列的单元格表示。所有的细胞最初都是白色的。 𝑞操作已应用到工作表。他们的𝑖-th可以描述如下: &#x1d4…