PTA选择题错题整理

## 选择题

1)

为什么C语言中,putchar()括号中有时候带' '(一对单引号)有时候没?
如:
#include<stdio.h>
main()
{
putchar('s');
return 0;
}    /*这个就要带 */
#include<stdio.h>
main()
{
char a='b';
putchar(a);
return 0;
}
此时,putchar中不带单引了,而b要带上单引,这是为啥?

解答:putchar函数是向终端输出一个**字符**,基本格式putchar(c)中的c既可以是变量(char字符型变量),也可以是常量(一个整数或一个字符)。
详细一点说:
当c为字符型变量时,输出该变量所指向的字符。
当c为一个被单引号引起来的字符时,输出该字符(注:该字符也可为转义字符);
当c为一个介于0~127的整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符。

例如,putchar(97)将输出字符'a',因为'a'的ASCII代码为97。

#include<stdio.h>
main()
{
putchar('s'); /*参数为一个字符s,为一个字符常量,所以带''号 。它的输出就是s */
return 0;
}
#include<stdio.h>
main()
{
char a='b'; /*定义了一个字符变量a,并且给a赋值存储字符 'b' */
putchar(a); /*参数为上一句定义的字符变量a,所以不用带''号,但输出的结果为字符'b'*/
return 0;
}

2)


下面的程序段输出是( A )。

short int a;
int b = 65536;

a = b;
printf("%d\n", a);(2分)

A.65536


B.0


C.-1


D.1


解答:unsigned short所能表示的数为2^16-1即是65535,用2进制表示为1111 1111 1111 1111,加1后就会变为0了,这个应该都理解,因为在32位平台下,4个字节嘛,题中b=65536,就是出现溢出了,即为0,,所以输出0。

3)

设变量已正确定义,以下( C )与其它switch语句不等价。

(2分)

A.
switch(choice){
      case 1: price = 3.0; break;
      case 2: price = 2.5; break;
      case 3: price = 4.0; break;
      case 4: price = 3.5; break;
      default: price = 0.0; break;
}

B.
switch(choice){
      default: price = 0.0; break;
      case 4: price = 3.5; break;
      case 3: price = 4.0; break;
      case 2: price = 2.5; break;
      case 1: price = 3.0; break;
}

C.
switch(choice){
      case 1: price = 3.0; break;
      case 2: price = 2.5; break;
      case 3: price = 4.0; break;
      case 4: price = 3.5; break;
}

D.
price = 0.0;
switch(choice){
      case 1: price = 3.0; break;
      case 2: price = 2.5; break;
      case 3: price = 4.0; break;
      case 4: price = 3.5; break;
}

解答:本题主要看price的结果。我们看当choice不为1,2,3,4这个大前提存在时:A,B选项中执行default 语句,使price赋值为0.0;D选项中虽然没有 default 语句,但是最开始有price = 0.0; 因此price仍然为0.0 。只有C选项执行后,price未被赋值。因此答案选C。


4)


下面不能正确进行字符串赋值操作的是( B )。
A: char s[6]={“ABCDE”};
B: char s[5]={‘A’,'B’,'C’,‘D’,‘E’};
C: char *s;s=”ABCDE”;
D: char *s; scanf(“%s”,s);
解析:B选项没有‘\0‘’字符串必须要有’\0’


5)


假设scanf语句执行时输入ABCDE<回车>,能使puts(s)语句正确输出ABCDE字符串的程序段是__

A.char s[5]={"ABCDE"}; puts(s);
B.char s[5]={'A', 'B', 'C', 'D', 'E'}; puts(s);
C.char *s; scanf("%s", s); puts(s);
D.char *s; s="ABCDE"; puts(s);


6)


以下哪个定义中的p不是指针,请选择恰当的选项: (C)
A.char **p;
B.char (*p)[10];
C.char *p[6];
D.给出的三项中,p都是指针
答:*p[6]代表指针数组,其中的元素才代表指针。

7)

若有以下说明,且0<=i<10,则____是对数组元素地址的正确表示:

int a[ ]={1,2,3,4,5,6,7,8,9,10},*p=a,i ;
(4分)

A.&(a+1)


B.a++


C.&p


D.&p[i ]


解析:A应该是错误的。他是不能这样表示的。
B选项:C语言在编译的时候会为数zhuan组分配内存,所以在编译好运行的时候a的地址是确定的了。
它后面是一块连续的内存。此时意味着a是一个常量,常量是不能做自增运算的。
C选项也是错误的:p是一个指针变量。变量意味着本身也有一个地址。只是这个地址对这个程序并没有实质用处。所以p本身也是一个地址,但它不是对数组元素地址的表示。
这道题是问正确引用吧。 这样只有D是对的。

8)


以下程序的输出结果是( )。

int main(void)
{ int p[8]={11,12,13,14,15,16,17,18}, i=0, j=0;
  while(i++<7)
     if(p[i]%2)  j+=p[i];
   printf("%d\n",j);
   return 0;
}
(4分)

A.42


B.45


C.56


D.60

解答:你关键理解 while(i++<7) 里面的表达式 i++<7是一个顺序点,什么是顺序点呢?就是编译器一定会先把while 中的条件表达式完全执行完,才会执行循环体中的语句。 而执行完后 i 的值就变了。所以第一次,实际上if语句执行判断 的是 if (p[1] %2= =0) ,整个程序就是计算 {12,13,14,15,16,17,18} 中奇数的和。 
顺序点导致上面的代码忽略了数组中的首元素, 具体的执行过程如下:
    /*
    第1次循环: i=0 , i<7成立 ,因为i++<7是while的判断语句,这是一个顺序点,所以i+1 ,此时i=1。 if语句判断 12 % 2 , j = 0
    第2次循环, i=1 .....i++ = 2 if语句判断 13 % 2  ,j = 13
    第3次循环, i=2 .....i++=3  if语句判断 14 % 2 , j=13
    第4次循环, i=3......i++=4 if语句判断  15 % 2  ,j = 13 + 15 = 28
    第5次循环,  i=4 .....i++=5 if语句判断 16 % 2 ,j=28
    第6次循环, i=5 .....i++=6 if语句判断 17 % 2 ,j = 28 + 17 = 45;
    第7次循环, i=6 .....i++=7 if语句判断  18 % 2==0 所以最终 j =45
    */

对于顺序点一定要理解,这个在实际工作中是经常碰到的。。这方面的资料可以参考 C99标准中 顺序点一节。
 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听酱-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值