【和春笋一起学C++】while语句和类型别名

目录

1. while语句

2. while语句应用实例——延时功能实现

3. 类型别名

(1)使用预处理器创建别名

(2)使用关键字typedef创建别名 


1. while语句

前面学习了for语句,其实在C++中,for和while循环本质上是相同的,while循环是没有初始化和更新(循环变量)部分的for循环,它只有测试条件和循环体:

while (test-condition)
      body

首先,程序计算圆括号内的测试条件(test-condition)表达式。如果该表达式为true,则执行循环体中的语句。与for循环一样,循环体由一条语句或一个语句块组成。执行完循环体后,程序返回测试条件,对它进行重新判断,如果该条件为非零,则再次执行循环体。测试和执行将一直进行下去,直到测试条件为false为止。和for循环一样,while循环也是一种入口条件循环,即测试条件一开始如果为false,则程序将不会执行循环体。

上篇文章《字符串比较》中输出字符串中每个字符ASCII的实例可以用while语句改写,如下:

#include <iostream>
#include <cstring>
using namespace std;
const int ArSize = 20;
int main()
{
	char name[ArSize];
	cin >> name;
	int i = 0;
	while (name[i] != '\0')
	{
		cout << name[i] << ": " << int(name[i]) << endl;
		i++;
	}
	return 0;
}

说明:(1)while语句中的循环变量需在while语句之前先初始化;(2)循环体中需要对循环变量进行更新,否则循环将一直持续下去,变成一个死循环。

前面文章《for语句和递增操作符》中的for语句如下:

for (initialization; test expression; update-expression)
{
    语句1;
    语句2;
    ...
    语句n;
}

改写为while语句为:

initialization; 
while (test expression)
{
    语句1;
    语句2;
    ...
    语句n;
    update-expression;
}

在使用while语句时需要注意的一点是while圆括号后面不能加分号,加了分号编译不会报错,也能执行,但这个循环很可能是一个死循环,如果上面程序在while括号的后面加了分号,会出现什么情况呢?将导致循环会一直持续,直到手动终止。

    while (name[i] != '\0');
	{
		cout << name[i] << ": " << int(name[i]) << endl;
		i++;
	}

永远记住,在C++中分号是结束一个语句。分号出现在while括号的后面表示while循环语句已经结束了,程序会认为没有循环体,从而导致后面花括号中的语句块没有被执行。在写while语句时务必要注意这一点。

2. while语句应用实例——延时功能实现

基于while语句的特性,可以用它来实现一个延时功能。比如:

long wait = 0;
while(wait < 10000)
   wait++;

说明:上面代码循环了1万次,用在延时器上相当于延时了一万个系统时间单位数。但是会存在一个问题,就是用在不同的处理器上,它延时的时间是不一样的。

头文件ctime提供了解决方案,它定义了一个符号常量——CLOCKS_PER_SEC,该常量等于每秒钟包含的系统时间单位数。因此,将系统时间单位数除以这个数可以得到实际的秒数,或者将秒数乘以CLOCKS_PER_SEC可以得到系统时间单位数。另外,ctime将clock_t作为clock()函数返回类型的别名,这意味着可以将变量声明为clock_t类型,编译器将把它转换为long,unsigned int或适合系统的其他类型。(PS:clock()函数返回的类型在有些系统上是long,在另外一些系统是unsigned long或其他类型)

下面代码通过clock()函数实现了延时功能。

#include <iostream>
#include <cstring>
#include <ctime>
using namespace std;
int main()
{
	cout << "Enter the delay time, in second: ";
	float secs;
	cin >> secs;
	clock_t delay = secs * CLOCKS_PER_SEC;
	cout << "starting\a\n";
	clock_t start = clock();
	while (clock() - start < delay)
		;
	cout << "done\a\n";

	return 0;
}

说明:(1)上面程序以系统时间单位为单位计算延迟时间,避免了在每轮循环中将系统时间转换为秒。(2)while后面是空语句,什么都没做。分号可以放在while括号的后面,也可以另起一行只写一个分号,单独一行只有一个分号它也是一条语句,只不过是条空语句,什么都没做。

3. 类型别名

上面的程序中使用了类型别名clock_t,在C++中为类型建立别名有两种方式。

(1)使用预处理器创建别名

#define BYTE char  //preprocessor replaces BYTE with char

这样预处理器在编译程序时将用char替换所有的BYTE,从而使BYTE成为char的别名。

(2)使用关键字typedef创建别名 

将BYTE作为char的别名如下:

typedef char BYTE;  //makes BYTE an alias for char

注意,末尾有分号,表明这是一条语句,可以理解为是一条声明语句,将BYTE声明为char的别名。下面是通用格式:

typedef typeName aliasName;

使用typedef创建别名,如同将aliasName声明为这种类型的变量,然后在声明的前面加上关键字typedef。如将byte_pointer成为char指针的别名,可将byte_pointer声明为char指针,然后在前面加上typedef,如下:

typedef char* type_pointer;

 当然也可以使用#define,不过在声明一系列变量时,这种方法会有问题,例如:

#define byte_pointer char*
byte_pointer p1, p2;

我们的本意是创建两个char指针变量p1和p2,但上面的语句实际上是创建了一个char指针变量p1和一个char变量p2,因为程序在编译的时候,预处理器将上面的声明语句解释为:

char* p1,p2;

如果使用了typedef来创建char指针变量的别名,就不会出现上面的问题,所以在创建复杂类型的别名时尽量使用typedef。另外,typedef不会创建新类型,它只是为已有的类型创建了一个新名称。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国标GB28181协议平台Liveweb:搭建建筑工地无线视频联网监控系统方案

随着科技高速发展&#xff0c;视频信号经过数字压缩&#xff0c;通过互联网宽带或者移动4G网络传递&#xff0c;可实现远程视频监控功能。将这一功能运用于施工现场安全管理&#xff0c;势必会大大提高管理效率&#xff0c;提升监管层次。而这些&#xff0c;通过Liveweb监控系统…

AS-REP Roasting离线爆破攻击

针对一个域内用户&#xff0c;其账户选项有个设置叫作 “不要求 kerberos 预身份验证”&#xff0c;它默认是关闭的。 当 “不要求 kerberos 预身份验证” 选项被勾选&#xff0c;会出现以下效果&#xff1a; as-req 报文中不需要添加用户 hash 加密的时间戳&#xff0c;自动返…

python中的局部变量、全局变量问题的思考(对比于c语言)

今天在运行python时遇到了局部变量和全局变量的问题&#xff0c;令我很迷惑。 首先&#xff0c;我在学习python之前先学习了c语言&#xff0c;所以c语言的一些东西影响了我对这个问题的思考。 在c语言中 局部变量和全局变量的区别就在于作用域的范围大小。在c语言中&#xf…

进网许可认证、交换路由设备检测项目更新25年1月起

实施时间 2025年1月1日起实施 涉及设备范围 核心路由器、边缘路由器、以太网交换机、三层交换机、宽带网络接入服务器&#xff08;BNAS&#xff09; 新增检测依据 GBT41266-2022网络关键设备安全检测方法交换机设备 GBT41267-2022网络关键设备安全技术要求交换机设备 GB/…

文件,IO流

目录 一 java 1. IO流 1&#xff09;输入输出&#xff08;以程序的视角判断 &#xff09; 1.1 IO流的分类 1&#xff09;字符流效率高于字节流 1.2 流和文件的关系 2. inputstream--字节输入流 2.1 fileinputstream 2.1.1常用方法&#xff1a; 1&#xff09;单个字符…

pymssql-2.1.4.dev5-cp37-cp37m-win_amd64.whl 安装

pip install pymssql 安装pymssql出现下面的问题 error: Microsoft Visual C 14.0 is required. Get it with “Microsoft Visual C Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools 因为要使用python连接sqlserver数据库&#xff0c;需要pymssq…

vue中验证码的实现方式

在写登录页的时候有的系统会让你也进行一下验证码绘制&#xff0c;那么验证码如何实现的呢&#xff1f;我在写登录页的时候通过将登录框&#xff0c;验证码分开页面来写&#xff0c;最后将它们变成标签来导入到我的样式页面中&#xff0c;这样写不仅方便&#xff0c;更容易修改…

致远互联OA使用问题及解决方法记录(个人)

1、更换设备登录账号出现绑定要求 解决&#xff1a;后台管理员账号——M3安全管理——安全设置——删除绑定 2、审批消息错误回退 解决&#xff1a;协同工作——一已办事项——取回——重新审批/流程监督里撤回/流程索道节点回退 3、签章图片在表单上显示过大 解决&#x…

《计算机组成及汇编语言原理》阅读笔记:p9-p27

《计算机组成及汇编语言原理》学习第 2 天&#xff0c;p9-p27 总结&#xff0c;总计 19 页。 一、技术总结 1.quantum physics(量子物理学) (1)quantum(量子) quantum的本意是&#xff1a;c. the smallest amount of sth(量子)。 In physics, a quantum is the minimum am…

java_章节作业

第1题 package com.hspedu.homework;/*** author:寰愬悏瓒&#xfffd;* date:2024/12/19 version:1.0*/ public class Homework01 {public static void main(String[] args) {//初始化Person对象数组&#xff0c;有3个Person对象&#xff1b;Person[] persons new Person[3];…

Audiocraft智能音频和音乐生成工具部署及使用

1、概述 Facebook开源了一款名为AudioCraft的AI音频和音乐生成工具。 该工具可以直接从文本描述和参考音乐生成高质量的音频和音乐。AudioCraft包含MusicGen、AudioGen和EnCodec三个模型&#xff0c;分别实现音乐生成、音频生成和自定义音频模型构建。 2、项目地址 https://…

华为云计算HCIE笔记02

第二章&#xff1a;华为云Stack规划设计 交付总流程 准备工作&#xff1a;了解客户的基本现场&#xff0c;并且对客户的需求有基本的认知。 HLD方案BOQ报价设备采购和设备上架 2.安装部署流程 硬件架构设计 硬件设备选配 设备上架与初始化配置 准备相关资料&#xff08;自动下载…

StarRocks:存算一体模式部署

目录 一、StarRocks 简介 二、StarRocks 架构 2.1 存算一体 2.2 存算分离 三、前期准备 3.1前提条件 3.2 集群规划 3.3 配置环境 3.4 准备部署文件 四、手动部署 4.1 部署FE节点 4.2 部署BE节点 4.3 部署CN节点&#xff08;可选&#xff09; 4.4 FE高可用…

红米Note 9 Pro5G刷小米官方系统

前言 刷机有2种方式&#xff1a;线刷 和 卡刷。 线刷 线刷&#xff1a;需要用电脑刷机工具&#xff0c;例如&#xff1a;XiaoMiFlash.exe&#xff0c;通过电脑和数据线对设备进行刷机。 适用场景&#xff1a; 系统损坏无法开机。恢复官方出厂固件。刷机失败导致软砖、硬砖的…

关于Tomcat的一些关键参数

目录 Tomcat参数总览设置位置 参数分析Tomcat内部类maxConnections属性Tomcat内部类的acceptCountTomcat有几个Acceptor线程Tomcat的工作线程池 Tomcat参数总览 package org.springframework.boot.autoconfigure.web; /** * * {link ConfigurationProperties ConfigurationP…

网络安全核心目标CIA

网络安全的核心目标是为关键资产提供机密性(Confidentiality)、可用性(Availablity)、完整性(Integrity)。作为安全基础架构中的主要的安全目标和宗旨&#xff0c;机密性、可用性、完整性频频出现&#xff0c;被简称为CIA&#xff0c;也被成为你AIC&#xff0c;只是顺序不同而已…

HIPT论文阅读

题目《Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning》 论文地址&#xff1a;[2206.02647] Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning 项目地址&#xff1a;mahmoodlab/HI…

智能挂号系统设计典范:SSM 结合 Vue 在医院的应用实现

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了医院预约挂号系统的开发全过程。通过分析医院预约挂号系统管理的不足&#xff0c;创建了一个计算机管理医院预约挂号系统的方案。文章介绍了医院预约挂号系统的系…

Windows11 家庭版安装配置 Docker

1. 安装WSL WSL 是什么&#xff1a; WSL 是一个在 Windows 上运行 Linux 环境的轻量级工具&#xff0c;它可以让用户在 Windows 系统中运行 Linux 工具和应用程序。Docker 为什么需要 WSL&#xff1a; Docker 依赖 Linux 内核功能&#xff0c;WSL 2 提供了一个高性能、轻量级的…

【hackmyvm】Diophante 靶场

1. 基本信息^toc 这里写目录标题 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描2.3. knock 3. WordPress利用3.1. wpscan扫描3.2. smtp上传后门 4. 提权4.1. 提权leonard用户4.2. LD劫持提权root 靶机链接 https://hackmyvm.eu/machines/machine.php?vmDiophante 作者…