CAPL编程系列第八期-第十四期回顾答案与分析

第八期 答案与分析

  1. 答案: 主要区别在于 CAPL 没有指针类型,因此没有 C 语言中用于指针解引用的 * 运算符和用于取地址的 & 运算符 。其他算术运算符基本一致。
  2. 答案: 结果是 3 分析: 因为 15 和 4 都是整数,执行整数除法,结果会截断小数部分。
  3. 答案: 结果的数据类型是 float,值是 2.5 分析: 当 float 类型和 int 类型进行运算时,int 类型会被隐式转换为 float,整个运算按浮点数进行,结果也是 float
  4. 答案: 需要将其中一个整数强制类型转换float 。代码示例:int a = 10, b = 4; float result = (float)a / b;float result = a / (float)b;float result = a / 4.0;
  5. 答案: 不能。取余运算符 % 只能用于整数类型的操作数
  6. 答案: 等价于 a = a * 3;
  7. 答案: ++ 运算符的作用是将变量的值增加 1 。在单独作为语句使用时(如 a++;++a;),前置和后置效果没有区别
  8. 答案: x 的值是 6y 的值是 5 分析: y = x++ 是后置自增。先将 x 的原始值 5 赋给 y,然后 x 再自增变为 6。
  9. 答案: x 的值是 6y 的值是 6 分析: y = ++x 是前置自增。先将 x 自增变为 6,然后将新值 6 赋给 y
  10. 答案: a 的值是 2 分析: a %= 4 等价于 a = a % 4。10 除以 4 的余数是 2。

第九期 答案与分析

  1. 答案: 运算结果的数据类型是整数(在 CAPL/C 中)。用整数 1 表示“真”(True/成立),用整数 0 表示“假”(False/不成立)
  2. 答案: 不等于:!=;逻辑与:&&
  3. 答案: 结果是 1 (真) 分析: 5 > 3 为真 (1),10 == 10 为真 (1)。1 && 1 结果为 1。
  4. 答案: 结果是 0 (假) 分析: 5 < 3 为假 (0),10 != 10 为假 (0)。0 || 0 结果为 0。
  5. 答案: 结果是 1 (真) 分析: 5 == 3 为假 (0)。!0 结果为 1。
  6. 答案: 逻辑非 ! 的优先级较高,通常高于关系运算符和 &&|| 。在不确定或为了清晰起见时,推荐使用小括号 () 来明确运算顺序
  7. 答案: 结果是 0 (假) 分析: age >= 18 为真 (1),但 salary > 6000 为假 (0)。1 && 0 结果为 0。
  8. 答案: 结果是 0 (假) 分析: score < 60 为假 (0),score >= 90 也为假 (0)。0 || 0 结果为 0。
  9. 答案:
    • 对于 &&:如果左侧表达式为假 (0),则不再计算右侧表达式,整个结果直接为假 (0)
    • 对于 ||:如果左侧表达式为真 (1),则不再计算右侧表达式,整个结果直接为真 (1)
  10. 答案: 原计划讲解关系运算符、逻辑运算符和位运算符 。实际只详细讲解了关系运算符逻辑运算符

第十期 答案与分析

  1. 答案: 主要操作数的二进制表示形式 不能用于浮点数,只能对整数进行操作
  2. 答案: & 代表按位与 (Bitwise AND)| 代表按位或 (Bitwise OR)
  3. 答案: 结果是 1 分析: 1001 & 0101 = 0001 (二进制),即十进制 1。
  4. 答案: 结果是 13 分析: 1001 | 0101 = 1101 (二进制),即十进制 13 (8+4+1)。
  5. 答案: ^ 代表按位异或 (Bitwise XOR) 。规则是:对应位不同时结果为 1,相同时结果为 0
  6. 答案: 对操作数的所有二进制位取反(0变1,1变0) 。对整数 9 进行按位取反 (~9),结果是 -10 分析: 这是基于 16 位 int 和补码表示法。90...01001,取反是 1...10110,这个补码表示的值是 -10。
  7. 答案: 将操作数的所有位向移动指定的位数 。右侧空出的位用 0 填充 。左移 n 位大致相当于乘以 2 的 n 次方
  8. 答案: 结果是 36 分析: 1001 << 2 = 100100 (二进制),即 32 + 4 = 36。
  9. 答案: 将操作数的所有位向移动指定的位数 。左侧空出的位填充规则不同:正数补 0(逻辑右移);负数补 1(算术右移,保持符号位)
  10. 答案: 9 >> 2 的结果是 2 -10 >> 2 的结果是 -3 分析: 9 (0...1001) >> 2 = 0...0010 (2)-10 (1...0110) >> 2 = 1...1101 (-3) (左侧补符号位 1)。

第十一期 答案与分析

  1. 答案: 遵循非零即真的规则。表达式结果只要不是 0(或 0.0 或 \0),条件就为真(成立)
  2. 答案:
    • 单分支: if (condition) { ... }
    • 双分支: if (condition) { ... } else { ... }
    • 多分支: if (condition1) { ... } else if (condition2) { ... } ... else { ... }
  3. 答案: 会执行 if (score > 90) 对应的代码块 else if 部分的条件不会被判断 分析: 多分支结构中,一旦找到第一个满足条件的 ifelse if,执行完其代码块后,就会立即跳出整个多分支结构
  4. 答案: 可以省略花括号 {} 。但教程不推荐省略,因为保留花括号使代码结构更清晰,不易出错
  5. 答案: 会输出 "B" 分析: 条件 0.0 被视为假 (0),因此执行 else 部分。
  6. 答案: 执行 write 语句 分析: 空格字符 ' ' 的 ASCII 码值不是 0,因此条件为真。
  7. 答案: condition ? value_if_true : value_if_false
  8. 答案: 比较变量 ab 的值,并将较大的那个值赋给变量 maxVal
  9. 答案: level 的值是 'P' 分析: grade >= 60 (75 >= 60) 条件为真,所以取 ? 后面的值 'P'
  10. 答案: if 结构在处理范围判断(如 score > 80 && score < 90)、复杂的逻辑组合(使用 &&, ||, !)以及对不同变量进行判断时,比 switch 更具优势和灵活性 switch 主要适用于对单个表达式与多个常量进行相等比较。

第十二期 答案与分析

  1. 答案: 主要用于判断一个表达式与多个常量值(通常是整型或字符型)进行相等比较

  2. 答案: case 后面必须跟整型或字符型的常量,或者是常量表达式(能在编译时确定值的表达式)。不能是变量

  3. 答案: 主要作用是跳出 (结束) 当前的 switch 语句块 。如果省略 break,程序会继续执行下一个 casedefault 的语句,发生贯穿 (Fall-through)

  4. 答案: default 分支用于处理 switch 表达式的值与所有 case 都不匹配的情况 。它在 switch 语句中是可选的,不是必须的

  5. 答案: 会输出 "BC"分析: option 为 2,匹配 case 2。执行 write("B");。由于 case 2 后面没有 break,发生贯穿,继续执行 case 3write("C");。遇到 case 3 后面的 break,跳出 switch

  6. 答案: 在 case 2: 分支的 write("B"); 语句后面加上 break; 即可。

  7. 答案: 将需要执行相同操作的多个 case 标签叠放在一起,省略它们之间的 break,只在最后一组共享代码的末尾加上 break 。结构示例:

    Code snippet
    case value_a:
    case value_b:
    case value_c:
        // Shared statements for a, b, c
        break;
    case value_d:
        // Statements for d
        break;
    
  8. 答案: 不合法分析: switch 表达式和 case 标签的值通常要求是整型或字符型常量 float 类型的 valuecase 1.0 不被允许。

  9. 答案: 合法分析: switch 表达式和 case 标签都可以使用 char 类型

  10. 答案: 使用 switch 结构通常更清晰易读。分析: 因为这种场景是典型的将一个错误码(整数)与多个特定的常量错误码进行相等比较,正是 switch 所擅长的。使用 if-else if 会写成一长串 if (errorCode == 1) {...} else if (errorCode == 2) {...},不如 switch 结构直观。


第十三期 答案与分析

  1. 答案: 主要区别在于条件判断的时机:while先判断条件再执行循环体;do-while先执行一次循环体再判断条件 do-while 循环至少会执行一次循环体
  2. 答案: 循环体执行的条件是 while 后面括号内的 condition 表达式计算结果为真 (非零)
  3. 答案: 输出 0 次 "Looping"。分析: 第一次判断条件 count > 5 (即 5 > 5) 时结果为假,直接跳过循环体。
  4. 答案: 输出 1 次 "Looping"。分析: do-while 先执行一次循环体,输出 "Looping",然后 count 变为 4。之后判断条件 count > 5 (即 4 > 5) 结果为假,循环结束。
  5. 答案: 立即强制退出当前所在的整个循环结构
  6. 答案: 立即结束当前这一轮循环迭代,跳过 continue 之后的剩余语句,直接进入下一次循环的条件判断(或 for 循环的更新步骤)
  7. 答案: 必须使用 break 语句(或者 return, exit 等能终止当前执行流程的语句)
  8. 答案: 会输出 1, 2, 4, 5分析: i 从 1 递增。当 i 变为 3 时,if (i == 3) 条件满足,执行 continue,跳过了该次循环的 write 语句。然后继续下一次循环,i 变为 4,if 条件不满足,输出 4,以此类推,直到 i 变为 5,输出 5。循环在 i 变为 6 时结束(因为 i<5 条件变为假是在下一次判断时)。修正:循环条件是 i < 5,当 i 从 4 增加到 5 时,循环条件 5 < 5 为假,循环结束。所以只会输出到 4。正确输出:1, 2, 4再次修正检查逻辑:i=0 -> i=1, write(1) -> i=2, write(2) -> i=3, continue -> i=4, write(4) -> i=5, 循环条件(5<5)为假, 结束。 最终答案:1, 2, 4
  9. 答案: 会输出 1, 2分析: i 从 1 递增。当 i 变为 3 时,if (i == 3) 条件满足,执行 break,立即退出 while 循环。
  10. 答案: 为了避免产生死循环 (Infinite Loop) 。如果循环条件一直为真,且循环体内没有改变条件的逻辑,循环将永远无法结束。

第十四期 答案与分析

  1. 答案: 包含三个部分:初始化 (initialization)条件 (condition)更新 (update)

  2. 答案: 执行顺序大致是 A -> B -> (if B is true) D -> C -> B -> (if B is true) D -> C -> B ... -> (if B is false) exit 初始化部分 (A) 只执行一次

  3. 答案: 会输出 3 次 "Hi"。分析: i 的值依次为 0, 1, 2 时,条件 i < 3 满足,执行循环体。当 i 变为 3 时,条件不满足,循环结束。

  4. 答案: 都可以省略,但分号 ; 必须保留 。如果省略条件部分,条件永远被视为真,可能导致死循环

  5. 答案: for (;;) 是一个无限循环 (死循环) 。必须在循环体内部使用 break (或其他退出机制) 来退出循环

  6. 答案: 可以用在 for 循环中 。它们的作用与在 while 循环中基本相同break 退出整个循环,continue 跳过当前迭代的剩余部分并直接进入更新 (update) 步骤

  7. 答案: 涉及到逗号运算符 , 的使用 。CAPL 的 for 循环不支持在初始化和更新部分使用逗号运算符来包含多个表达式,而 C 语言支持

  8. 答案: 不能直接写在 for 的更新部分(如 i++, j--)。需要将对 j 的更新操作 j--; 移到循环体内部去执行

    Code snippet
    int i, j=init_j;
    for(i=init_i; condition; i++){
        // loop body
        j--; // Update j inside the body
    }
    
  9. 答案: 使用 for 循环通常更简洁。分析: for 循环将初始化、条件判断和更新这三个控制循环次数的关键部分集中在一行,结构更清晰。

  10. 答案: 主要是代码结构更紧凑for 循环将循环变量 i 的初始化 (i = 2)、循环条件 (i < number) 和每次迭代后的更新 (i++) 都放在了 for 语句的括号内,使得控制循环流程的逻辑更集中,相对 while 需要在循环内外分别处理这三部分可能更清晰。