几道C语言程序题

1、以下程序输出的结果是

#include <stdio.h>

int main() {
	int i=10,j=10;
	printf("%d,%d\n", ++i+j++, j--);
}

A、 21,10
B、 20,10
C、 21,9
D、 20,9

答案:B
解析:C语言中函数参数处理顺序是从右向左的。所以会先处理最右端的参数,然后依次向左处理。 j-- 会先输出 j 的值 10,再执行 -- 操作。这个时候 j 的值会变成 9。继续到左边的参数,++i+j++ 会先对 i 的值执行 ++ 操作变成 11,因为已经是最左边的参数了,11 会再加上之前 j 的值 9 作为最终传入的参数结果,输出 20。

2、以下程序输出结果是

#include <stdio.h>

int main() {
    int i = 0;
    printf("%d,%d,%d,%d,%d\n", ++i, ++i, i++, ++i, i++);
}

A、 1,2,2,3,3
B、 1,2,2,4,4
C、 5,5,2,5,0
D、 5,4,2,2,0

答案:C
解析:
我们已经知道C语言中函数参数处理顺序是从右向左的。但是这里出现了 ++ii++ 先加和后加的区别。在从右往左的处理中,i++ 表示符合从右向左处理的前提下,当即处理该参数。++i 表示只是执行 ++i 运算并不将结果作为最终参数结果,而是将参数位置压入堆栈,只有当所有参数从右向左处理完毕之后,才从堆栈弹出所有因为延后操作语句而没有填入最终结果的参数位置,将最终执行的结果 i,作为相应的参数值填入。

回到本题,从右往左:
第一个参数 i 先输出 0 再 ++,i 值变为 1;
第二个参数先 ++,i 值变为 2,但由于参数还没有处理完,并不当成最终参数填入,继续往左。
第三个参数先输出 2,再 ++,i 值变为 3。
第四个参数同第二个参数,只执行 ++ 操作,i 值变为 4。
第五个参数执行 ++ 操作,i 值变为 5。因为所有参数已经处理完毕,所以从堆栈弹出刚才记录的所有因为延后操作没有填入结果的参数位置,将最终计算的 i 值 5,填入其中。
这样最终输出的结果就是 5,5,2,5,0。

3、以下函数值的类型是

fun (float x) {
	float y;
	y = 3*x - 4;
	return y;
}

A、int
B、不确定
C、void
D、float

答案:A
解析:C 语言中,函数值类型的定义可以缺省,此时函数值的隐含类型是整型。

4、以下程序的输出结果是

#include <string.h>
#include <stdio.h>

main() {
	char st[20] = "hello\0\t\‘\\";
	printf("%d,%d\n", strlen(st), sizeof(st));
}

A、 9,9
B、 5,20
C、 13,20
D、 20,20

答案:B
解析:strlen 是计算算字符串长度的,并且不包含结束符等特殊符号。sizeof 是计算所占内存大小的。

5、若有说明 int i,j = 2, *p = &i;,则能完成 i = j 赋值功能的语句是

A、 i = *p
B、*p = *&j
C、 i = &j
D、 i = **p

答案:B
解析:
首先,先了解 “*” 的含义。在声明中为了把指针和一般变量区别开,所以在指针变量前加一个 “*”。注意此时 “*” 号只是起一个和普通变量相区别的作用。当 “*” 号不是在声明语句中出现时,它有了另一个含义,就是表示指针变量指向地址所储存的值。

回过头我们再来看 int i,j = 2, *p = &i; 这是一个声明语句,所以这里的 “*” 只是一个区别普通变量的作用。可以改写成 int *p; p = &i;,意思就是将变量 i 的内存地址赋值给指针 p;

这样答案中的 *p 没有出现在声明语句中,这里 “*” 的意思就是就是p指针变量指向地址所存储的值了,也就是 i。

同样的,答案中 *&j 的意思就是先取 j 对应的内存地址,再取内存地址指向所对应的值,最终还是 j 本身。

6、下列程序输出的结果是

#include <stdio.h>

main() {
	char a[10] = { 9,8,7,6,5,4,3,2,1,0 }, *p = a+5;
	printf("%d", *--p);
}

A、 非法
B、 a[4] 的地址
C、 5
D、 3

答案:C
解析:a 是一个字符串数组,数组在内存中是顺序存储的。*p = a+5 也就是把 a+5 的内存地址赋值给 p 了,从下标 0 开始往后数 5 位,这个地址刚好是元素 4 的地址。输出的时候 *--p 就是元素 4 对应的地址先减一变成 5 的地址,再通过 * 取值刚好就是 5。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值