二级C语言的选择题 又麻烦大家了

(20)若运行以下程序时,从键盘输入 ADescriptor<CR>(<CR>表示回车),则下面程序的运行结果是#include <stdio.h>
main()
{char c;
int v0=1,v1=0,v2=0;
do{switch(c=getchar())
{case ′a′:case ′A′:
case ′e′:case ′E′:
case ′i′:case ′I′:
case ′o′:case ′O′:
case ′u′:case ′U′:v1+=1;
default:v0+=1;v2+=1; }
}while(c!=′\n′);
printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);}
A)v0=7,v1=4,v2=7
B)v0=8,v1=4,v2=8
C)v0=11,v1=4,v2=11
D)v0=13,v1=4,v2=12
答案是D 题目我都不怎么理解,怎么这么多冒号?麻烦讲解一下

(25)main()
{ int x,y,z;
x=0,y=x+1;
z=x+y;}
这个程序段为什么是正确的?我觉得x=0,y=x+1;应该改为x=0;y=x+1;才对啊?

(30)以下程序的输出结果是
#include <stdio.h>
void prt (int *x, int *y, int *z)
{printf("%d,%d,%d\n",++*x,++*y,*(z++));}
main()
{int a=10,b=40,c=20;
prt (&a,&b,&c);
prt (&a,&b,&c);}
A)11,42, 31
12,22,41
B)11,41,20
12,42,20
C)11,21,40
11,21,21
D)11,41,21
12,42,22
答案是B
我知道*(z++)=*z,所以第一次输出c=20,但是第二次输出时,z=z+1了,为什么还是等于20?

39)设有如下定义:
struck sk
{ int a;
float b;
} data;
int *p;
若要使P指向data中的a域,正确的赋值语句是
A)p=&a;
B)p=data.a;
C)p=&data.a;
D)*p=data.a;
答案是C 我想问问为什么D错 怎么改?

(21)设有定义:int n=0,*p=&n,**q=&p,则下列选项中正确的赋值语句是
A)p=1;
B)*q=2;
C)q=p;
D)*p=5;
答案是D 我想知道其他项是什么意思?我懵了

(32)若已定义:
int a〔〕={0,1,2,3,4,5,6,7,8,9}, *p=a,i;
其中 0≤i≤9, 则对a数组元素不正确的引用是
A)a〔p-a〕
B)*(&a〔i〕)
C)p〔i〕
D)a〔10〕
答案是D我知道,我想问问A项是什么意思?P不是指向a的首地址吗?

(35)下面程序段的运行结果是
char *format="%s,a=%d,b=%d\n";
int a=11,b=10;
a+=b;
printf(format,"a+=b",a,b);
A)for,"a+=b",ab
B)format,"a+=b"
C)a+=b,a=21,b=10
D)以上结果都不对
答案是C (format,"a+=b",a,b);是什么意思啊

(39)有以下程序:
#include <stdio.h>
union pw
{ int i;
char ch〔2〕;}a;
main()
{a.ch〔0〕=13;a.ch〔1〕=0;printf("%d\n",a.i);}
程序的输出结果是
A)13
B)14
C)208
D)209
答案是A 我实在是不会啊

(17)若有说明:int *p,m=5,n;以下正确的程序段是
A)p=&n;scanf("%d",&p);
B)p=&n;scanf("%d",*p)
C)scanf("%d",&n);*p=n;
D)p=&n;*p=m;
答案是D 我想知道为什么C不可以

(36)有以下程序
fun(int x,int y,int z)
{ z=x*y;}
main()
{int a=4,b=2,c=6;
fun(a,b,c);
printf("%d",c);
}
程序运行后的输出结果是
A)16
B)6
C)8
D)12
答案是B 为什么不是C?

不好意思问了 谢谢各位在我成长的路上给我的帮助

第(20)题,case后面没有break;所以即使执行完该case语句也会接着执行下一条,因为每个case都没有break所以每次switch都要执行一次default,那么你的这句话共12个字符(含回车),属于case情况的只有aeio,因此case ′u′:case ′U′:v1+=1;
执行四遍,default执行12遍。
(25)好像的确不能这么写
(30)z++是指参数z(它是指针啊)在执行完该语句后加一,他只是个参数而已,函数结束就销毁了,下次传rude还是整数c的地址,z还是加一,不影响输出
(39)大哥,你的p没初始化,它指向谁你知道吗,不知道就乱赋值,岂不是出问题
(21)a你给p赋1那岂不是给指针乱赋值,1即是0x00000001,那应该是操作系统占用的地方,b和a同理*q就是p,c乱弹琴,不同数据类型啊
(32)p和a都个代表一个地址值,虽然是地址值,但是他们一样可以相减,当成数来算,结果为零那就是取a的第一个元素(汇编里面经常拿地址作计算)
(35)printf(format,"a+=b",a,b);相当于把format指针作为第一个参数,因为printf的第一个参数本来就是一个地址值,这句话相当于printf("%s,a=%d,b=%d\n","a+=b",a,b);
(39)这个题貌似不太严谨(个人认为),union是这样的一个结构,他按照最长的单位来分配内存,比如union里面有个double还有个int那么就分配sizeof(double)的内存,取数时,按int取就只取前几个字节,按double则取完整,因为这些数放在连续的内存中,只是你的取法不同而已。但是现在大多数机子的int类型占用4个字节比char[2]还多两个,所以我说他不严谨,而以前int只占2个字节,那么答案就合理了,在内存中的存放为:[0d][00](十六进制)前面为低,后面为高,按int取得话,会把这两部分看作一体,即汇编中所说的高高低低原则,那么00放高位,0d放低位即000d,这是十六进制,转化为十进制就是13,当然这些系统都帮你做好了,你只要会用就可以了
。。。。。。
你的题真多啊
。。。。。。
(17)老问题,p没初始化,指向的空间不确定
(36)这个涉及到引用传递和值传递,看来你学得很少啊,在这里(c语言中只有值传递,但是可以用指针模拟引用传递c++里面直接就有引用传递)值传递是系统新建变量来存储接收到的值,注意这些变量都是新建的与原来的无关,当函数结束时,这些参数也就销毁了,谁让他们不是指针,他们的所保存的值也就一并销毁,那么你在怎么算也白搭,所以如果想通过函数来改变外部变量的值,就一定要传指针进去,因为指针即使销毁了,但是他所指的内存空间的值还在,不知道这样说你明白否
ps:你的分很难赚啊
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-08-26
(20)若运行以下程序时,从键盘输入 ADescriptor<CR>(<CR>表示回车),则下面程序的运行结果是#include <stdio.h>
main()
{char c;
int v0=1,v1=0,v2=0;
do{switch(c=getchar())
{case ′a′:case ′A′:
case ′e′:case ′E′:
case ′i′:case ′I′:
case ′o′:case ′O′:
case ′u′:case ′U′:v1+=1;
default:v0+=1;v2+=1; }
}while(c!=′\n′);
printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);}
A)v0=7,v1=4,v2=7
B)v0=8,v1=4,v2=8
C)v0=11,v1=4,v2=11
D)v0=13,v1=4,v2=12
答案是D 题目我都不怎么理解,怎么这么多冒号?麻烦讲解一下
考点是switch case的分支结构,case标注了分支结构的入口,只要满足了某个case的条件,就从这里进入往下做,直到遇到break或者语句段结束,所以default的部分一定是会做的,v1变量用来统计“元音字母”的个数

(25)main()
{ int x,y,z;
x=0,y=x+1;
z=x+y;}
这个程序段为什么是正确的?我觉得x=0,y=x+1;应该改为x=0;y=x+1;才对啊?
这个是“逗号表达式”从左到右依次做下去

(30)以下程序的输出结果是
#include <stdio.h>
void prt (int *x, int *y, int *z)
{printf("%d,%d,%d\n",++*x,++*y,*(z++));}
main()
{int a=10,b=40,c=20;
prt (&a,&b,&c);
prt (&a,&b,&c);}
A)11,42, 31
12,22,41
B)11,41,20
12,42,20
C)11,21,40
11,21,21
D)11,41,21
12,42,22
答案是B
我知道*(z++)=*z,所以第一次输出c=20,但是第二次输出时,z=z+1了,为什么还是等于20?
????疑似会是个不确定的值?????

39)设有如下定义:
struck sk
{ int a;
float b;
} data;
int *p;
若要使P指向data中的a域,正确的赋值语句是
A)p=&a;
B)p=data.a;
C)p=&data.a;
D)*p=data.a;
答案是C 我想问问为什么D错 怎么改?
D是把p指向的空间赋值,不是把p指向data的a,改成C那样

(21)设有定义:int n=0,*p=&n,**q=&p,则下列选项中正确的赋值语句是
A)p=1;
B)*q=2;
C)q=p;
D)*p=5;
答案是D 我想知道其他项是什么意思?我懵了
A:p是指针,一般不这样赋值
B:q是二维指针,加上*后,得到的是一个一位指针,同样不这样赋值;
C:p和q维数不同,通常不这样做

(32)若已定义:
int a〔〕={0,1,2,3,4,5,6,7,8,9}, *p=a,i;
其中 0≤i≤9, 则对a数组元素不正确的引用是
A)a〔p-a〕
B)*(&a〔i〕)
C)p〔i〕
D)a〔10〕
答案是D我知道,我想问问A项是什么意思?P不是指向a的首地址吗?
A就是 a[0] ,因为p-a=0

(35)下面程序段的运行结果是
char *format="%s,a=%d,b=%d\n";
int a=11,b=10;
a+=b;
printf(format,"a+=b",a,b);
A)for,"a+=b",ab
B)format,"a+=b"
C)a+=b,a=21,b=10
D)以上结果都不对
答案是C (format,"a+=b",a,b);是什么意思啊
把字符串带进去就好啦,比如printf("AAA");你可以把 "AAA"定义成一个变量,传进来

(39)有以下程序:
#include <stdio.h>
union pw
{ int i;
char ch〔2〕;}a;
main()
{a.ch〔0〕=13;a.ch〔1〕=0;printf("%d\n",a.i);}
程序的输出结果是
A)13
B)14
C)208
D)209
答案是A 我实在是不会啊
union只会有一个数据,他们在有相同的首地址,只是长度可能会不同,所以你把它在内存中存放的方式画出来就直到为什么了

(17)若有说明:int *p,m=5,n;以下正确的程序段是
A)p=&n;scanf("%d",&p);
B)p=&n;scanf("%d",*p)
C)scanf("%d",&n);*p=n;
D)p=&n;*p=m;
答案是D 我想知道为什么C不可以
p没有实际的存储空间,所以*p = n 会出错

(36)有以下程序
fun(int x,int y,int z)
{ z=x*y;}
main()
{int a=4,b=2,c=6;
fun(a,b,c);
printf("%d",c);
}
程序运行后的输出结果是
A)16
B)6
C)8
D)12
答案是B 为什么不是C?
函数传递的是值的拷贝,所以不会影响原来的值,a、b、c都不变本回答被提问者采纳
第2个回答  2008-08-26
20:
每个case后都没有出现break,所以它们会一直执行到最后,即执行到default,在default中出现v0+=1,v2+=1,所以输入多少个字符,v0,v1就会增加多少。v1+=1出现在case 'U',但是它之前的case中,都没有break语句,所以,只要是a,A,e,E,i,I,o,O,u,U都会执行v1+=1。重点去看一下书上switch中的break特点。

21:
这是个逗号运算符,逗号两边是两个赋值表达式(不是语句,重要!)。

30:传给函数参数的是 &c,即c的地址,假设是1000,执行z++,于是z所代表的地址1004(没有影响c)。下次调用时,我们仍然传递&c,即1000,所以它的值并没有变。

39:
C和D是不一样的,当执行这两句后,如果data.a的值后来发生了变化,C中的P会跟着变,但是D中的P却不会变。C中的P才是真正的与data.a指向同一内存地址。D不符合题意,不用改。

21:P是指针,不宜直接赋值。q是指针的指针,*q是指针,所以也不宜直接赋值。q和p不是一种类型,前者是指针,后者是指针的指针,也不能互相赋值。

32:p-a是个整型数,比如后来执行了p++,那么p-a就等于1了,此时p[0]=1,但是a[0]=0,而a[p-a]其实就和p[0]相等。可以这么说,a[p-a]就相当于p[0]。

35:把format的值代进去,(format,"a+=b",a,b)就相当于 ("%s,a=%d,b=%d\n","a+=b",a,b)。"a+=b"取代%s,是字符串。a 和b 分别取代%d,%d,整数。

39:去看看union。低这节在前,高字节在后,0x000000D,13。

17:不清楚。

36:函数参数是值传递的,z=x*y,此时z的值是8,但它不会影响c的值。自己对比一下指针作为函数,还有引用作为函数。
相似回答