复合语句 / 条件 / 编程语言 / 语句 · 2023年 10月 14日 0

条件语句

66 次浏览

万事都有第二种可能,如果不是,那一定有第三种可能。条件语句一般分为如下三种:

  • if/else
  • 条件运算符 a ? b : c
  • switch多分支选择

编程语言的条件语句

  • C/ObjC/C++/Java/C#/PHP/仓颉 等都支持类似"if/else/switch"条件语句, VB形态略有差异。
  • C/ObjC/C++/Java/C#/PHP 等都支持条件运算符 "? :".
  • Kotlin 支持if/else形式,但不支持switch和 a ? b : c形式,而是用when和if (cond) b else c.
  • Python 支持if/elif/else条件表达式。
  • VB 有两种if语句:单行if语句和块结构if语句。单行if语句必须在一个语句行内,If/Then/Else即可,块结构if语句必须有End If做结尾。
  • Pascal 采用 if <condition> then <statement>; 或 if <condition> then <statement> else <statement>; 两种形态,如果statement是复合语句,两边用begin/end包起来。

条件语句形态

大部分编程语言用括号表示条件,单条或复合语句作为条件执行。

  • 最早Fortran就有if语句概念,不过都是用大写字母IF ... THEN ... END IF.
  • Python定义了一套缩进规则,条件左右不需要括号(Go也吸收这种便捷方式),缩进后的语句作为执行,当然也不需要大括号或者其他形式包起来。
  • Shell语言在中括号内写条件,要求中括号前后需要有空格,执行语句不需要大括号,自然写出即可。
  • Perl要求if或else之后一定有大括号,不管是否是单条语句。

嵌套的条件语句

  • 万事都有N种可能,每种可能还有M种可能。
  • 嵌套if/else可能造成混乱,究竟哪个if对着哪个else? 最简单的原则就是else总跟在前面跟它最近且未与其他else匹配的if.
    • 对于C/C++/Java等编程语言产生混乱的另外一个原因是它们更加自由,编译器通常忽略空格和缩进,且条件单条语句不需要用{}包裹。语言标准没有明确,就要求代码规范约束程序员。
    • 而对于Perl/Algol而言,不存在这种情形,语法要求如果有if嵌套,一定要加复合语句。对强制要求有if/then/else/end的语言,也不存在if/else嵌套混乱的问题。

条件语句的本质

从汇编语言的角度,条件语句对应于汇编代码cmp/jmp/j*之类的比较和跳转指令。

条件表达式也返回值?

  • 仓颉 单分支的if语句块返回Unit类型"()",双分支if/else也可以返回值,返回if/else分支的最小公共父类型。
    例如如下变量x会被赋值为1:var i = 1;  var x = if (i > 0) { 1 } else { 0 }