循环 / 编程语言 / 语句 · 2023年 10月 14日 0

循环语句

25 次浏览

循环语句一般分为while/for/do-while三种。

  • while是if语句重复执行的优化版,如果没有while,就需要用if和goto组合代替。
  • for循环是条件和变化简单的while语句的优化版。
  • C/ObjC/C++/Java/C#/Kotlin 等都支持这三种形式。

foreach

foreach为了优化处理集合的对象,减少不必要的index++. 一些语言为了更简单,for语句也可实现foreach功能。

  • PHP/Java/C# 等均有foreach的身影。
  • Kotlin的for语句和foreach很像,采用for xxx in yyy形态。Kotlin的forEach和forEachIndexed主要用于集合对象遍历,后者除了可以获取每个元素,还可以获取下标。

无限循环

for(;;)和while(1)都是无限循环。编译器对于二者的处理可能有差,前者可能仅仅用jmp不断重复,后者可能有test/je指令。当然,优秀的编译器应该会最优化指令。

for循环历史

  • 最早ALGOL 58就有for循环的雏形。
  • Fortran 66引入了FOR语句,Fortran 90引入了DO/WHILE语句。
    • for I : = 0 ( 1 ) N;

break和continue

和switch/case语句类似,循环语句一样除了有break跳出,还增加了continue继续判断条件。对于汇编实现,均是jmp或j*系列跳转,并没有多么深奥。

  • C/ObjC/C++/Java/C#/PHP/Kotlin 等均支持break和continue.
  • Fortran 用exit对应break,cycle对应continue.
  • PHP 还支持形如break 3跳出第三层循环这种语句,可以灵活跳转出更高层循环。
  • Kotlin 也支持break和continue跳到特定循环,前提需要在循环开始添加标记,比如loop1@代表loop1循环标记。

循环判断结束值

  • Fortran 提供一种简洁的循环初始、结束、步隔的语法。
    do i = 1, 5, 1
    print *, i
    end do

循环标签

  • Fortran 可以为每个循环语句加上标签,可方便阅读或者跳转。例如:
    loop: do i = 1, 5

循环语句优化

当循环条件每次都不同,执行语句也只依赖条件,是可以并行执行的。

  • Fortran提供了concurrent可让编译器做并行优化。