练习二级选择题,点击选项即可查看结果
int a, b; a = (b=2, b+3);,变量 a 和 b 的值分别是()(b=2, b+3) 的求值顺序:先算 b=2(b 被赋值为 2),再算 b+3=5;整个逗号表达式的值取最后一项 5,赋给 a,故 a=5、b=2。注意逗号表达式的值是最后一个子表达式的值,但前面所有子表达式都会被求值(包括赋值)。int x = ~0 << 4;(int 占 4 字节),x 的十进制值是()~0 对全 0 按位取反得到全 1(32 位均为 1,即 0xFFFFFFFF)。~0 << 4 左移 4 位,低位补 0,高位溢出丢弃,结果为 0xFFFFFFF0。按 int 解释时该补码表示 -16。选项 D 写明了 0xFFFFFFF0 即 -16,最为准确;选项 A 虽然数值也是 -16,但未体现 32 位全 1 左移的中间过程,故选 D。int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};,表达式 *(*(a+1)+2) 的值是()a 是 3 行 4 列二维数组名,可看作「指向含 4 个元素的一维数组的指针」。a+1 指向第 1 行(下标从 0 算),*(a+1) 是第 1 行首元素地址即 &a[1][0];*(a+1)+2 是 &a[1][2];再 * 解引用得到 a[1][2]=7。等价写法是 a[1][2]。char *p="hello"; 与 char s[]="hello"; 叙述正确的是()char *p="hello"; 中 p 是指针,指向字符串常量(通常存于只读区),sizeof(p) 为指针大小(4 或 8 字节),不能修改 *p 的内容;char s[]="hello"; 中 s 是字符数组,把字符串拷贝到数组里,sizeof(s)=6(含 '\0'),可以修改 s[i]。但 strlen 都是从首字符数到 '\0',结果均为 5,故 B 正确。int fact(int n){ if(n<=1) return 1; return fact(n-1)*n; }
int main(){ printf("%d", fact(4)); return 0; }fact(4) 递归展开:fact(4)=fact(3)*4=(fact(2)*3)*4=((fact(1)*2)*3)*4=(1*2*3*4)=24。递归终止条件 n<=1 正确(fact(1)=1),不会无限递归。结果为 4 的阶乘 24。