Ada学习(2)Statements

news2024/11/26 14:50:33

文章目录

  • if statements / expression
    • if statements
    • if expression
  • Case Statement / Expression
    • Case Statement
    • Case Expression
  • Loop Statement
    • 基本循环结构 loop
    • while loop
    • For 循环
      • Note
      • For ... loop Control Variable
      • For ... loop Range Evaluation
      • Declare block (声明代码块)
    • 反向遍历
  • Exit Statement
    • 无条件的 exit
    • 有条件的 exit
    • exit 到某一层循环
  • Null Statements
  • Condition Operators (条件运算符)
    • Relation Operators(关系运算符)
    • Logical Operators(逻辑运算符)
    • Membership Operators (成员资格运算符)
  • 练习

在 Ada 中,语句(Statements)是执行操作的主要工具,它们负责处理程序的控制流程和数据操作。以下是一些你需要特别注意的关键点:

分配语句(Assignment Statements):在 Ada 中,分配语句用于改变变量的值。分配语句的形式是:Variable := Expression;,注意 := 是分配操作符。

控制流语句(Control Flow Statements):Ada 提供了丰富的控制流语句,包括条件语句(如 if,case),循环语句(如 for,while,loop),以及异常处理语句(如 begin … exception)等。

过程调用(Procedure Calls):过程调用是一个语句,它执行一段预定义的代码。过程调用可能会改变程序的状态或执行某些动作。

返回语句(Return Statements):在函数中,返回语句用于结束函数的执行并返回一个值。

序列语句(Sequencing Statements):Ada 的语句通常按照它们在代码中出现的顺序执行。这个顺序可以通过使用复合语句(begin … end)来改变,复合语句允许你将多个语句组合成一个单独的语句。

异常语句(Exception Statements):Ada 提供了强大的异常处理机制,你可以使用 raise 语句来显式抛出异常,使用 begin … exception 结构来处理可能出现的异常。

中止语句(Abort Statements):Ada 支持并发编程,你可以使用中止语句来中止一个并发任务的执行。

在编写 Ada 语句时,需要注意语句的结束通常需要一个分号(;),这是 Ada 语法的一部分。此外,Ada 是强类型语言,所有的操作都必须在类型兼容的值之间进行,这在写表达式和分配语句时尤其重要。

if statements / expression

if statements

在 Ada 中,if 可以用作语句(Statement)或者表达式(Expression),这两者有一些不同的特性和用法。

  • if 语句(If Statements):if 语句用于基于一个或多个条件执行不同的代码块。if 语句没有返回值,它的主要目标是改变程序的控制流。if 语句可以与 elsif,elseend if 关键字一起使用来创建复杂的条件逻辑。例如:
if condition then
    -- ... code to execute if condition is True
elsif other_condition then
    -- ... code to execute if other_condition is True
else
    -- ... code to execute if both conditions are False
end if;

if expression

  • if 表达式(If Expressions):if 表达式是在 Ada 202x 标准中引入的新特性,也称为条件表达式(Conditional Expressions)。if 表达式用于根据一个条件计算两个不同的表达式之一的值。if 表达式总是有一个值,这个值可以被赋值给一个变量或用在其他表达式中。例如:
X := (if condition then expression1 else expression2);

在这里插入图片描述

Case Statement / Expression

在这里插入图片描述
在这里插入图片描述

Case Statement

case 语句:根据某个表达式的值来决定执行哪一段代码。语法如下:

case Expression is
   when Value_1 => -- When Expression equals Value_1
      -- Code to execute
   when Value_2 =>
      -- Code to execute
   when others => -- When Expression doesn't match any of the above
      -- Code to execute
end case;

  • case 语句必须覆盖所有可能的情况,这可以通过添加 when others 来实现。
  • ada 中不需要使用 break 防止不同的 case 之间的击穿行为

Case Expression

case 表达式:和 case 语句类似,但它返回一个值,而不是执行一段代码。语法如下:

Result := (case Expression is
              when Value_1 => -- When Expression equals Value_1
                 -- Value to return
              when Value_2 =>
                 -- Value to return
              when others => -- When Expression doesn't match any of the above
                 -- Value to return
           );

和 case 语句一样,case 表达式也必须覆盖所有可能的情况。

在这里插入图片描述

注意,case 语句和 case 表达式都只能用于离散类型(例如整数类型和枚举类型)。不允许用于实数类型或复杂的用户定义类型。

Loop Statement

在这里插入图片描述

基本循环结构 loop

loop
    -- Statements
    exit when Condition;  -- Optional exit condition
end loop;

此结构将不断重复执行循环内的语句,直到遇到 exit 语句。exit 语句后面的 when 条件是可选的,如果省略,则 exit 将无条件地结束循环。

while loop

while Condition loop
    -- Statements
end loop;

此结构将在条件为 True 时重复执行循环内的语句。一旦条件变为 False,循环将结束。

For 循环

for Index in Range loop
    -- Statements
end loop;

此结构将为 Range 中的每个值执行循环内的语句。Index 是一个隐式声明的变量,其范围由 Range 定义。在循环内部,你可以使用 Index,但不能修改它。

Note

在这里插入图片描述

  • For循环的 range 必须从小到大,例如这里的 1 .. 10
  • 如果从大到小的 range 则会导致一个“空”,进而导致 loop 内的语句不执行:
    在这里插入图片描述
  • 如果非要实现逆向的遍历,请使用 reverse 关键字

For … loop Control Variable

  • 理论上,一个完整的 for 循环应该写成:

在这里插入图片描述

  • 也就是增加明确的类型限定,但如果没有指定,写成 for X in range 1..10 loop 那么 ada 会自动推断这个数据的类型

  • 此外 ada 的 for 循环语句支持对 所有离散类型的变量 进行遍历
    在这里插入图片描述

    • 在这个例子中,程序会把 Character 中的所有可能的值遍历一遍。以下是代码的运行结果:
      A
      B
      C
      ...
      X
      Y
      Z
      
  • X 在运行过程中是不可改变的,是一个常量 constant
    在这里插入图片描述

For … loop Range Evaluation

  • 在 Ada 中,for 循环的范围(range)是在循环开始之前进行一次求值的,并且在整个循环期间保持不变。这意味着循环范围的起始和终止值在循环开始时会被计算出来,并且在整个循环的执行过程中保持不变。
    在这里插入图片描述
    • 上图中,在 for 循环期间改变了 B 的值,但这不会影响到 for 循环的执行

Declare block (声明代码块)

在 Ada 中,你可以在 for 循环中使用 declare 块来引入局部变量declare 块允许你在循环的上下文中声明和使用变量,这些变量的作用范围仅限于该 for 循环

以下是一个示例代码,演示了在 for 循环中使用 declare 块引入局部变量的方法:

procedure For_Loop_Declare_Block is
begin
   for i in 1..5 loop
      declare
         X : Integer := i * 10;
      begin
         Put_Line("i = " & Integer'Image(i) & ", X = " & Integer'Image(X));
      end;
   end loop;
end For_Loop_Declare_Block;
  • 在上述代码中,declare 块用于在 for 循环中引入一个局部变量 XX 的初始值是循环变量 i 乘以 10

  • 输出结果:

    i = 1, X = 10
    i = 2, X = 20
    i = 3, X = 30
    i = 4, X = 40
    i = 5, X = 50
    
  • 在每次循环迭代时,X 的值会根据 i 的值重新计算,并在 declare 块内部使用。注意,X 的作用范围仅限于 declare 块内部,在块之外无法访问。

  • 使用 declare 块可以帮助你在 for 循环中引入临时变量,以便在循环体内部执行特定的计算或操作。这样可以提高代码的可读性和模块化。

反向遍历

你也可以使用 reverse 关键字来反向遍历范围:
在这里插入图片描述

for Index in reverse Range loop
    -- Statements
end loop;

Exit Statement

在这里插入图片描述

  • 在上面的 loop 中我们提到了 exit 语句。在 Ada 语言中,exit 语句用于提前退出循环。它有两种形式:

无条件的 exit

  • 直接使用 exit 关键字,这将立即结束当前循环。
loop
    -- Some statements
    exit; -- This will exit the loop unconditionally.
    -- Some other statements
end loop;

有条件的 exit

  • exit 关键字后面可以跟 when 子句,这样就只有当 when 后面的条件为 True 时,才会退出循环。
loop
    -- Some statements
    exit when Condition; -- This will exit the loop when the Condition is True.
    -- Some other statements
end loop;

exit 到某一层循环

  • 需要注意的是,如果你有嵌套的循环结构,并且希望从内层循环退出到某个特定的外层循环,你可以给外层循环一个名称,并在 exit 语句中指定这个名称。例如:
Outer: loop
    -- Some statements
    Inner: loop
        -- Some other statements
        exit Outer when Condition; -- This will exit the Outer loop when the Condition is True.
    end loop Inner;
    -- Even more statements
end loop Outer;
  • 在这个例子中,当 ConditionTrue 时,将直接退出到 Outer 循环,而不仅仅是退出 Inner 循环。这种指定循环名称的功能在处理复杂的嵌套循环时非常有用。

Null Statements

在 Ada 中,空语句(null statement)用于表示没有操作执行的语句。它是一个分号 ;,用于在某些语法要求语句的位置上提供一个空语句。

空语句在以下情况下可以使用:

  • 在需要语句但不需要执行任何操作的地方。例如,一个空的 if 分支或一个循环的空迭代。

    if Condition then
       null; -- 空的 if 分支
    else
       -- Some statements
    end if;
    
    for i in 1..10 loop
       -- 无操作的循环迭代
       null;
    end loop;
    
  • 在一行上需要一个语句但不需要执行任何操作的地方。例如,在一个代码块的最后一行。

    begin
       -- Some statements
       null; -- 空语句
    end;
    

Condition Operators (条件运算符)

在 Ada 中,有多种条件运算符(Condition Operators)可以用来创建条件表达式,这些表达式可用于 if 语句、while 语句或者其他需要布尔(Boolean)结果的地方。以下是一些常见的条件运算符:

Relation Operators(关系运算符)

关系运算符(Relational Operators):这些运算符用于比较两个值:

  • =:等于
  • /=:不等于
  • <:小于
  • <=:小于或等于
  • >:大于
  • >=:大于或等于
if X = Y then
    -- ... code to execute if X is equal to Y
end if;

Logical Operators(逻辑运算符)

逻辑运算符(Logical Operators):这些运算符用于组合或反转布尔值:

  • and:逻辑与
  • or:逻辑或
  • xor:逻辑异或
  • not:逻辑非
if X > Y and Z < W then
    -- ... code to execute if X is greater than Y and Z is less than W
end if;

在这里插入图片描述

  • ada 中的 andor 运算符是不进行短路处理的(short-circuit),即,对于 and 两边的内容哪怕左边已经 False 了依然会检查右边表达式的值,同样的 or 哪怕左边已经是 True 了,依然也要检查右边的表达式
  • 但是对于 and thenor else 则会进行 short-circuit
  • and then 如果左边的表达式为 False,那么就不会计算右边的表达式,因为无论右边表达式的结果如何,整个 and then 表达式的结果都已经确定为 False
  • or else 如果左边的表达式为 True,那么就不会计算右边的表达式,因为无论右边表达式的结果如何,整个 or else 表达式的结果都已经确定为 True
  • 这种设计是为了让程序员可以明确地选择是否需要进行短路运算。

Membership Operators (成员资格运算符)

成员资格运算符(Membership Operators):这些运算符用于检查一个值是否在一个集合中:

  • in:成员
  • not in:非成员
    例如:
if X in 1 .. 10 then
    -- ... code to execute if X is between 1 and 10, inclusive
end if;

练习

在这里插入图片描述

  • 应该用 = 来判断是否相等

在这里插入图片描述
在这里插入图片描述

  • case 应该覆盖到所有的情况,但是这里缺少了 0 的情况
    • 1..9 覆盖了 1-9 的情况
    • 10..Integer'Last 包含了10到最大的 Integer 的情况
    • Integer'First .. -1 包含了 Integer 中的最小值到 -1 的情况
    • 唯独缺乏 A = 0 的处理操作

在这里插入图片描述

  • case 引导的情况同样不能发生重叠

在这里插入图片描述

  • case 只能针对离散的情况

在这里插入图片描述

  • I 在循环中是一个常量,其值不能被修改

在这里插入图片描述

  • range 的范围从 100 不会执行 loop 中的内容

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 这是因为在进入循环的时候 X=1 虽然循环过程中 X 改变成了 10 但这不影响循环的次数。

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

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

相关文章

手把手教小白安装Jenkins

一、Jenkins简介 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 简而言之&#xff0c;Jenkins就是一款将构建&#xff0c;打…

例3:模板

例&#xff1a;如图所示流程&#xff0c;乙烷和丙烷混合液进入蒸发器Evaporator&#xff0c;从天然气吸收热量后进入压缩机Compressor&#xff0c;压缩后的气体进入冷凝器Condenser&#xff0c;最后通过J-T阀&#xff08;焦耳-汤姆逊节流膨胀阀&#xff09;回到进入蒸发器前的状…

抖音SEO矩阵营销系统/MVC源码部署二次开发搭建

首先&#xff0c;抖音SEO矩阵系统源码开发&#xff0c;如何做独立部署&#xff0c;首先我们需要深刻理解这个系统的开发逻辑是什么&#xff1f;开发的前言是在抖音平台做流量新增&#xff0c;现在抖音及各大主流短视频平台&#xff0c;流量新增&#xff0c;各大企业需要在短视频…

10- YOLO算法一 (目标检测)

要点&#xff1a; yolo算法属于 One-stage detector 一 YOLO v1 1) 将一幅图像分成SxS个网格(grid cell)&#xff0c;如果某个object的中心 落在这个网格中&#xff0c;则这个网格就负责预测这个object。 2)每个网格要预测B个bounding box&#xff0c;每个bounding box 除了…

springboot配置多个数据源【详解】

springboot配置多个数据源【详解】 前言&#xff0c;什么是数据源与数据库连接池一、配置文件进行配置&#xff1a;1.导入依赖&#xff1a; 二、编写配置类&#xff1a;1.用来指定包扫描、指定sqlSessionTemplateRef2&#xff0c;用来指定mapper.xml的路径3.Mybatis主数据源ds1…

DNS协议、ICMP协议、NAT技术

目录 一、DNS协议 1.1 认识DNS 1.2 域名简介 1.3 域名解析过程 1.4 使用dig工具分析DNS过程 二、ICMP协议 2.1 ICMP协议的定位 2.2 ICMP功能 2.3 ICMP协议格式&#xff08;了解&#xff09; 2.4 ping命令 2.5 traceroute命令 三、NAT技术&#xff08;重点&#xff…

JavaWeb13-JavaScript 开发利器之 jQuery-01

1. 说明 1.1 现状 1、jquery 使用情况 2、Vue 使用情况 1.2 官方文档 学习地址: https://www.w3school.com.cn/jquery/index.asp API地址: https://jquery.cuishifeng.cn/ 1.3 JQuery 是什么? 1.3.1 基本介绍 jQuery 是一个快速的&#xff0c;简洁的 javaScript 库…

BAPC 2022 Pre 部分题解

BAPC 2022 Pre 部分题解 K (11). Lots of Liquid题目描述题意思路代码 F (6). Fastestest Function题目描述题意思路代码 B (2). Bubble-bubble Sort题目代码 A (1). Abbreviated Aliases题目题意思路代码 I (9). Jabbing Jets题目题意思路代码 E (5). Extended Braille题目题意…

SQL调优-性能参数介绍

-- 课程表 create table course ( cid int(3), cname varchar(20), tid int(3) ); -- 教师表 create table teacher (tid int(3),tname varchar(20),tcid int(3) ); -- 教师证表 create table teacherCard (tcid int(3),tcdesc varchar(200) );explain select语句分析 1.id…

自监督ViT:DINO-v1和DINO-v2

1. 概述 基于ViT&#xff08;Vision Transformer&#xff09;自监督在最近几年取得了很大进步&#xff0c;目前在无监督分类任务下已经超过了之前的一些经典模型&#xff0c;同时在检测分割等基础任务领域也展现出了强大的泛化能力。这篇文章将主要基于DINO系列自监督算法介绍…

NoSQL之Redis高可用与优化

目录 一、Redis高可用二、Redis 持久化2.1 Redis 提供两种方式进行持久化2.2 RDB持久化2.2-1 触发条件2.2-2 执行流程2.2-3 启动时加载 2.3 AOF 持久化2.3.1 开启AOF2.3.2 执行流程2.3.3 执行流程启动时加载 三、RDB和AOF的优缺点四、Redis 性能管理4.1 查看Redis内存使用4.2 内…

Linux上,多个JDK版本如何管理(交流贴)

1. 多个JDK版本面临的问题 公司大多数业务都是用Oracle JDK 8&#xff0c;笔者做大数据查询引擎调研时&#xff0c;则需要使用JDK 17 因此&#xff0c;需要在Linux服务器同时安装JDK 8和17&#xff0c;同时需要能智能地快速切换JDK版本&#xff0c;已使用不同的查询引擎需求 …

一致性哈希算法

如何分配请求&#xff1f; 大多数网站背后肯定不是只有一台服务器提供服务&#xff0c;因为单机的并发量和数据量都是有限的&#xff0c;所以都会用多台服务器构成集群来对外提供服务。 但是问题来了&#xff0c;现在有那么多个节点&#xff08;后面统称服务器为节点&#xf…

史上最详细sqlmap入门教程

最近做安全测试&#xff0c;遇到了SQL盲注的漏洞&#xff0c;从发现漏洞&#xff0c;确认漏洞&#xff0c;协助开发复现漏洞&#xff0c;验证漏洞一整套流程下来&#xff0c;有了亿点点收获&#xff0c;下面分享给大家&#xff0c;希望对软件测试同学有所启发&#xff0c;难度不…

ChatGPT原理简介

承接上文GPT前2代版本简介 GPT3的基本思想 GPT2没有引起多大轰动&#xff0c;真正改变NLP格局的是第三代版本。 GPT3训练的数据包罗万象&#xff0c;上通天文下知地理&#xff0c;所以它会胡说八道,会说的贼离谱&#xff0c;比如让你穿越到唐代跟李白对诗&#xff0c;不在一…

JavaScript如何实现上拉加载,下拉刷新?

一、前言 下拉刷新和上拉加载这两种交互方式通常出现在移动端中。本质上等同于PC网页中的分页&#xff0c;只是交互形式不同。开源社区也有很多优秀的解决方案&#xff0c;如iscroll、better-scroll、pulltorefresh.js库等等。这些第三方库使用起来非常便捷。我们通过原生的方式…

(13)ADDA

AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号&#xff0c;ADC模拟-数字转换器 DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换…

Spring MVC 框架

Spring MVC 框架 Spring MVC 简介Spring MVC 概述 Spring MVC入门案例案例步骤案例总结Bean 加载控制 请求与响应RequestMapping 设置请求路径请求参数五种类型参数传递普通参数POJO 数据类型嵌套POJO类型参数数组类型参数集合类型参数 JSON 数据传输参数日期类型参数传递响应 …

WPF MaterialDesign 初学项目实战(5):设计首页

原项目视频 WPF项目实战合集(2022终结版) 25P 其他内容 WPF MaterialDesign 初学项目实战&#xff08;0&#xff09;:github 项目Demo运行 WPF MaterialDesign 初学项目实战&#xff08;1&#xff09;首页搭建 WPF MaterialDesign 初学项目实战&#xff08;2&#xff09;首页…

甲骨文云服务器 您无权访问任何应用程序?怎么办

背景 注册了甲骨文&#xff0c;登入是个难题&#xff0c;每次登入都这样显示 您无权访问任何应用程序 解决办法 因为我的服务器在于日本的大阪&#xff0c;每次登入链接即使采用书签的方法都会自动跳转到中国或者美国&#xff0c;所以是登入的连接错误了&#xff0c;我们需…