这题是不是答案错了?
switch语句不用带分号,所以D是错误的,那么是选A吗? 我看哪个都不咋对 选 C 人造人 发表于 2020-4-29 15:51选 C
木有break 本帖最后由 sunrise085 于 2020-4-29 15:58 编辑
A的错误在于switch后面的条件不能是浮点数
B的错误在于case常量后没有冒号
C正确,case后面可以是常量或常量表达式,default也不一定在最后
D的错误在于switch后有个分号
#include <stdio.h>
int main(void) {
int b = 1;
switch(b) {
case 1: printf("1\n");
default: printf("d\n");
case 1 + 2: printf("3\n");
}
return 0;
}
.file "main.c"
.text
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC0:
.ascii "1\0"
.LC1:
.ascii "d\0"
.LC2:
.ascii "3\0"
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
call __main
movl $1, -4(%rbp)
movl -4(%rbp), %eax
cmpl $1, %eax
je .L3
cmpl $3, %eax
je .L4
jmp .L2
.L3:
leaq .LC0(%rip), %rcx
call puts
.L2:
leaq .LC1(%rip), %rcx
call puts
.L4:
leaq .LC2(%rip), %rcx
call puts
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (GNU) 7.4.0"
.def puts; .scl 2; .type 32; .endef
wp231957 发表于 2020-4-29 15:53
木有break
可以没有 sunrise085 发表于 2020-4-29 15:53
A的错误在于switch后面的条件不能是浮点数
B的错误在于case常量后没有冒号
C的错误在于case后面有个表达 ...
C的错误在于case后面有个表达式,case后面只能是常量不能是表达式
可以是常量表达式,在编译阶段计算 1 + 2
wp231957 发表于 2020-4-29 15:53
木有break
break不是必须的。那不是语法错误,只是有时没有break,会得不到预期结果而已。 人造人 发表于 2020-4-29 15:58
C的错误在于case后面有个表达式,case后面只能是常量不能是表达式
可以是常量表达式,在编译阶段计算...
哈哈,你发晚了。我早就修改啦!
sunrise085 发表于 2020-4-29 16:01
哈哈,你发晚了。我早就修改啦!
^_^ sunrise085 发表于 2020-4-29 16:00
break不是必须的。那不是语法错误,只是有时没有break,会得不到预期结果而已。
题出的有毛病
合法表达式,意思就是能编译过就OK
那不在扯吗 wp231957 发表于 2020-4-29 16:04
题出的有毛病
合法表达式,意思就是能编译过就OK
那不在扯吗
对呀,合法就是能通过编译就行
ABD都通过不了编译的
页:
[1]