第八期 答案与分析
- 答案: 主要区别在于 CAPL 没有指针类型,因此没有 C 语言中用于指针解引用的
*运算符和用于取地址的&运算符。其他算术运算符基本一致。 - 答案: 结果是 3
。分析: 因为 15 和 4 都是整数,执行整数除法,结果会截断小数部分。 - 答案: 结果的数据类型是
float,值是 2.5。分析: 当 float类型和int类型进行运算时,int类型会被隐式转换为float,整个运算按浮点数进行,结果也是float。 - 答案: 需要将其中一个整数强制类型转换为
float。代码示例: int a = 10, b = 4; float result = (float)a / b;或float result = a / (float)b;或float result = a / 4.0;。 - 答案: 不能。取余运算符
%只能用于整数类型的操作数。 - 答案: 等价于
a = a * 3;。 - 答案:
++运算符的作用是将变量的值增加 1。在单独作为语句使用时(如 a++;或++a;),前置和后置效果没有区别。 - 答案:
x的值是 6,y的值是 5。分析: y = x++是后置自增。先将x的原始值 5 赋给y,然后x再自增变为 6。 - 答案:
x的值是 6,y的值是 6。分析: y = ++x是前置自增。先将x自增变为 6,然后将新值 6 赋给y。 - 答案:
a的值是 2。分析: a %= 4等价于a = a % 4。10 除以 4 的余数是 2。
第九期 答案与分析
- 答案: 运算结果的数据类型是整数(在 CAPL/C 中)。用整数 1 表示“真”(True/成立),用整数 0 表示“假”(False/不成立)
。 - 答案: 不等于:
!=;逻辑与:&&。 - 答案: 结果是 1 (真)
。分析: 5 > 3为真 (1),10 == 10为真 (1)。1 && 1结果为 1。 - 答案: 结果是 0 (假)
。分析: 5 < 3为假 (0),10 != 10为假 (0)。0 || 0结果为 0。 - 答案: 结果是 1 (真)
。分析: 5 == 3为假 (0)。!0结果为 1。 - 答案: 逻辑非
!的优先级较高,通常高于关系运算符和&&、||。在不确定或为了清晰起见时,推荐使用小括号 ()来明确运算顺序。 - 答案: 结果是 0 (假)
。分析: age >= 18为真 (1),但salary > 6000为假 (0)。1 && 0结果为 0。 - 答案: 结果是 0 (假)
。分析: score < 60为假 (0),score >= 90也为假 (0)。0 || 0结果为 0。 - 答案:
- 对于
&&:如果左侧表达式为假 (0),则不再计算右侧表达式,整个结果直接为假 (0)。 - 对于
||:如果左侧表达式为真 (1),则不再计算右侧表达式,整个结果直接为真 (1)。
- 对于
- 答案: 原计划讲解关系运算符、逻辑运算符和位运算符
。实际只详细讲解了关系运算符和逻辑运算符 。
第十期 答案与分析
- 答案: 主要操作数的二进制表示形式
。不能用于浮点数,只能对整数进行操作 。 - 答案:
&代表按位与 (Bitwise AND);|代表按位或 (Bitwise OR)。 - 答案: 结果是 1
。分析: 1001 & 0101 = 0001(二进制),即十进制 1。 - 答案: 结果是 13
。分析: 1001 | 0101 = 1101(二进制),即十进制 13 (8+4+1)。 - 答案:
^代表按位异或 (Bitwise XOR)。规则是:对应位不同时结果为 1,相同时结果为 0 。 - 答案: 对操作数的所有二进制位取反(0变1,1变0)
。对整数 9 进行按位取反 ( ~9),结果是 -10。分析: 这是基于 16 位 int和补码表示法。9是0...01001,取反是1...10110,这个补码表示的值是 -10。 - 答案: 将操作数的所有位向左移动指定的位数
。右侧空出的位用 0 填充 。左移 n 位大致相当于乘以 2 的 n 次方 。 - 答案: 结果是 36
。分析: 1001 << 2 = 100100(二进制),即 32 + 4 = 36。 - 答案: 将操作数的所有位向右移动指定的位数
。左侧空出的位填充规则不同:正数补 0(逻辑右移);负数补 1(算术右移,保持符号位) 。 - 答案:
9 >> 2的结果是 2。 -10 >> 2的结果是 -3。分析: 9 (0...1001) >> 2 = 0...0010 (2)。-10 (1...0110) >> 2 = 1...1101 (-3)(左侧补符号位 1)。
第十一期 答案与分析
- 答案: 遵循非零即真的规则。表达式结果只要不是 0(或 0.0 或
\0),条件就为真(成立)。 - 答案:
- 单分支:
if (condition) { ... } - 双分支:
if (condition) { ... } else { ... } - 多分支:
if (condition1) { ... } else if (condition2) { ... } ... else { ... }
- 单分支:
- 答案: 会执行
if (score > 90)对应的代码块。 else if部分的条件不会被判断。分析: 多分支结构中,一旦找到第一个满足条件的 if或else if,执行完其代码块后,就会立即跳出整个多分支结构。 - 答案: 可以省略花括号
{}。但教程不推荐省略,因为保留花括号使代码结构更清晰,不易出错 。 - 答案: 会输出 "B"
。分析: 条件 0.0被视为假 (0),因此执行else部分。 - 答案: 会执行
write语句。分析: 空格字符 ' '的 ASCII 码值不是 0,因此条件为真。 - 答案:
condition ? value_if_true : value_if_false。 - 答案: 比较变量
a和b的值,并将较大的那个值赋给变量maxVal。 - 答案:
level的值是 'P'。分析: grade >= 60(75 >= 60) 条件为真,所以取?后面的值'P'。 - 答案:
if结构在处理范围判断(如score > 80 && score < 90)、复杂的逻辑组合(使用&&,||,!)以及对不同变量进行判断时,比switch更具优势和灵活性。 switch主要适用于对单个表达式与多个常量进行相等比较。
第十二期 答案与分析
-
答案: 主要用于判断一个表达式与多个常量值(通常是整型或字符型)进行相等比较
。 -
答案:
case后面必须跟整型或字符型的常量,或者是常量表达式(能在编译时确定值的表达式)。不能是变量。 -
答案: 主要作用是跳出 (结束) 当前的
switch语句块。如果省略 break,程序会继续执行下一个case或default的语句,发生贯穿 (Fall-through)。 -
答案:
default分支用于处理switch表达式的值与所有case都不匹配的情况。它在 switch语句中是可选的,不是必须的。 -
答案: 会输出 "BC"。分析:
option为 2,匹配case 2。执行write("B");。由于case 2后面没有break,发生贯穿,继续执行case 3的write("C");。遇到case 3后面的break,跳出switch。 -
答案: 在
case 2:分支的write("B");语句后面加上break;即可。 -
答案: 将需要执行相同操作的多个
case标签叠放在一起,省略它们之间的break,只在最后一组共享代码的末尾加上break。结构示例: Code snippetcase value_a: case value_b: case value_c: // Shared statements for a, b, c break; case value_d: // Statements for d break; -
答案: 不合法。分析:
switch表达式和case标签的值通常要求是整型或字符型常量。 float类型的value和case 1.0不被允许。 -
答案: 合法。分析:
switch表达式和case标签都可以使用char类型。 -
答案: 使用
switch结构通常更清晰易读。分析: 因为这种场景是典型的将一个错误码(整数)与多个特定的常量错误码进行相等比较,正是switch所擅长的。使用if-else if会写成一长串if (errorCode == 1) {...} else if (errorCode == 2) {...},不如switch结构直观。
第十三期 答案与分析
- 答案: 主要区别在于条件判断的时机:
while是先判断条件再执行循环体;do-while是先执行一次循环体再判断条件。 do-while循环至少会执行一次循环体。 - 答案: 循环体执行的条件是
while后面括号内的condition表达式计算结果为真 (非零)。 - 答案: 输出 0 次 "Looping"。分析: 第一次判断条件
count > 5(即5 > 5) 时结果为假,直接跳过循环体。 - 答案: 输出 1 次 "Looping"。分析:
do-while先执行一次循环体,输出 "Looping",然后count变为 4。之后判断条件count > 5(即4 > 5) 结果为假,循环结束。 - 答案: 立即强制退出当前所在的整个循环结构
。 - 答案: 立即结束当前这一轮循环迭代,跳过
continue之后的剩余语句,直接进入下一次循环的条件判断(或for循环的更新步骤)。 - 答案: 必须使用
break语句(或者return,exit等能终止当前执行流程的语句)。 - 答案: 会输出 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。 - 答案: 会输出 1, 2。分析:
i从 1 递增。当i变为 3 时,if (i == 3)条件满足,执行break,立即退出while循环。 - 答案: 为了避免产生死循环 (Infinite Loop)
。如果循环条件一直为真,且循环体内没有改变条件的逻辑,循环将永远无法结束。
第十四期 答案与分析
-
答案: 包含三个部分:初始化 (initialization)、条件 (condition)、更新 (update)
。 -
答案: 执行顺序大致是 A -> B -> (if B is true) D -> C -> B -> (if B is true) D -> C -> B ... -> (if B is false) exit
。初始化部分 (A) 只执行一次 。 -
答案: 会输出 3 次 "Hi"。分析:
i的值依次为 0, 1, 2 时,条件i < 3满足,执行循环体。当i变为 3 时,条件不满足,循环结束。 -
答案: 都可以省略,但分号
;必须保留。如果省略条件部分,条件永远被视为真,可能导致死循环 。 -
答案:
for (;;)是一个无限循环 (死循环)。必须在循环体内部使用 break(或其他退出机制) 来退出循环。 -
答案: 可以用在
for循环中。它们的作用与在 while循环中基本相同:break退出整个循环,continue跳过当前迭代的剩余部分并直接进入更新 (update) 步骤。 -
答案: 涉及到逗号运算符
,的使用。CAPL 的 for循环不支持在初始化和更新部分使用逗号运算符来包含多个表达式,而 C 语言支持。 -
答案: 不能直接写在
for的更新部分(如i++, j--)。需要将对j的更新操作j--;移到循环体内部去执行。 Code snippetint i, j=init_j; for(i=init_i; condition; i++){ // loop body j--; // Update j inside the body } -
答案: 使用
for循环通常更简洁。分析:for循环将初始化、条件判断和更新这三个控制循环次数的关键部分集中在一行,结构更清晰。 -
答案: 主要是代码结构更紧凑。
for循环将循环变量i的初始化 (i = 2)、循环条件 (i < number) 和每次迭代后的更新 (i++) 都放在了for语句的括号内,使得控制循环流程的逻辑更集中,相对while需要在循环内外分别处理这三部分可能更清晰。