文章目录

  • 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 iswhen Value_1 => -- When Expression equals Value_1-- Code to executewhen Value_2 =>-- Code to executewhen 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 iswhen Value_1 => -- When Expression equals Value_1-- Value to returnwhen Value_2 =>-- Value to returnwhen others => -- When Expression doesn't match any of the above-- Value to return);

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

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

Loop Statement

基本循环结构 loop

loop-- Statementsexit 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
beginfor i in 1..5 loopdeclareX : Integer := i * 10;beginPut_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 statementsexit; -- This will exit the loop unconditionally.-- Some other statements
end loop;

有条件的 exit

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

exit 到某一层循环

  • 需要注意的是,如果你有嵌套的循环结构,并且希望从内层循环退出到某个特定的外层循环,你可以给外层循环一个名称,并在 exit 语句中指定这个名称。例如:
Outer: loop-- Some statementsInner: loop-- Some other statementsexit 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 thennull; -- 空的 if 分支
    else-- Some statements
    end if;
    
    for i in 1..10 loop-- 无操作的循环迭代null;
    end loop;
    
  • 在一行上需要一个语句但不需要执行任何操作的地方。例如,在一个代码块的最后一行。

    begin-- Some statementsnull; -- 空语句
    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 但这不影响循环的次数。

Ada学习(2)Statements相关推荐

  1. Ada语言学习(1)Basic Knowledge

    文章目录 说在前头 命名 注释 数字 变量 变量类型 signed integers Enumerations Floating Points 类型重用(继承) 类型转换 运算符 属性(Attribu ...

  2. Python3破冰人工智能,你需要掌握一些数学方法

    为什么要把数学建模与当今火热的人工智能放在一起? 首先,数学建模在字面上可以分解成数学+建模,即运用统计学.线性代数和积分学等数学知识,构建算法模型,通过模型来解决问题.数学建模往往是没有对与错,只有 ...

  3. 世界上第一位程序员,竟然是诗人拜伦的女儿?

    导读:女神节来了,数据叔终于忍不住要聊一聊这个憋了很久的八卦,世界上第一位程序员,当然也是世界上第一位女程序员--Ada. 作者:数据叔 来源:大数据DT(ID:hzdashuju) 这位女神级的神人 ...

  4. 想用 Python3 破冰人工智能?首先你得懂这些数学方法!

    为什么要把数学建模与当今火热的人工智能放在一起? 首先,数学建模在字面上可以分解成数学+建模,即运用统计学.线性代数和积分学等数学知识,构建算法模型,通过模型来解决问题. 数学建模往往是没有对与错,只 ...

  5. 程序员学人工智能,为什么必须要懂数学建模?

    https://www.toutiao.com/a6678180224556859918/ 从数学建模到人工智能 为什么要把数学建模与当今火热的人工智能放在一起? 首先,数学建模在字面上可以分解成数学 ...

  6. 《计算机科学概论》—第1章1.2节计算的历史

    本节书摘来自华章出版社<计算机科学概论>一书中的第1章,第1.2节计算的历史,作者[美]内尔·黛尔(Nell Dale)约翰·路易斯(John Lewis),更多章节内容可以访问云栖社区& ...

  7. 【Ada语言学习笔记】参考手册中文翻译及注记——语言概述

    我们在Concurrent & Distributed Systems课的实验中需要用到Ada语言. 通俗而笼统地讲,Ada语言是一种描述特别详尽的语言(highly specific),因此 ...

  8. Ada 语言学习(3)复合类型数据——Array

    文章目录 Array 数据类型声明 数组索引 数组范围 数组复制 数组初始化 直接赋值 通过拷贝赋值 不同索引范围但长度相等 非指定类型边界收缩 多维数组 数组遍历 数组切片 访问和动态检查 直接访问 ...

  9. 从零开始学习Ada(入门)

    What is Ada? Ada 语言最初设计是为了构建长周期的.高度可靠的软件系统.它提供了一系列功能来定义相关的数 据类型(type).对象(object)和操作(operation)的程序包(p ...

最新文章

  1. 随笔——js中的this指向,apply()与 call()
  2. redis 集群搭建_一文轻松搞懂redis集群原理及搭建与使用
  3. airpods pro是按压还是触摸_AirPods 与 AirPods Pro 哪个好?如何正确选购华强北版本...
  4. 寻找重复的子树 Find Duplicate Subtrees
  5. 判断大小简单算法_算法浅谈——人人皆知却很多人写不对的二分法
  6. mysql cleaned up_MySQL数据库无法启动的简单排错
  7. subtext blog装好了,老外的文档还是写的有些问题
  8. 比反射更快:委托 第2部分
  9. 如何启动php程序下载,php – 最好的方式来启动下载?
  10. HTTP和HTTPS的区别是什么?
  11. python数字转换成字符串比较大小_Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、...
  12. 2018 年程序员求生欲测试题(全国卷)
  13. [译] 如何用 Android vitals 解决应用程序的质量问题
  14. 电脑如何录制屏幕视频?介绍三个电脑录屏的小技巧
  15. git 中 HEAD 概念
  16. 规模增长背后抖音如何构建直播体验优化
  17. 数字 IC 笔试面试必考点(12)静态时序分析 STA
  18. 九峰影业创始人_乾社成员雅集第二辑
  19. windows cmd curl 中文乱码
  20. 一个小游戏让你彻底弄懂墨卡托投影

热门文章

  1. python爬虫百度贴吧代码大全_获取贴吧图片的python爬虫
  2. ios 震动api_震动API
  3. matlab英,MATLAB 2016a 工具包中-英对照
  4. 解决Cfree [Error] g++.exe: 5\mingw\lib\: No such file or directory
  5. java mahout使用教程_Mahout使用简例
  6. 阿里巴巴图标库引入方法
  7. v-chart大小无法控制
  8. 未root手机 ida动态调试安卓so文件—— 学习实践 《教我兄弟学Android逆向09 IDA动态破解登陆验证》
  9. pmsm matlab模型,Simulink中PMSM模型的改进在电机控制仿真中的工程应用
  10. VLAN作用以及特点