c语言笔面试题错题解析5

1.signed char a = 0xe0;

    unsigned int b= a;

    unsigned char c= a;

下面说法正确的是?

A (a>0)&&(b>0)为真

B  c== a 为真

C  b 的16进制为0xffffffe0

D  都不对

有符号数最高位为1,所以a为负数;

负数原码转补码是符号位不变,其他各位取反,然后加1; 

无符号数的原,反,补码一样 ,

补码转原码:a = 0xe0的补码是1110 0000,所以a的原码是1010 0000 = -32 。

c是无符号数1110 0000就是它的原码,所以c = 224 。

signed char转signed int: 将a的原码拓展为32位编码1000 0000 0000 0000 0010 0000 ;

有符号负数原码转补码为,之后signed int转unsigned int同理:1111 1111 1111 1111 1110 0000 = 0xffffffe0 = b。 

2.int a= 5,则++(a++)的值是?

++ 是一目运算符,自增运算,它只能用于一个变量,即变量值自增1, 不能用于表达式。

++(a++) 里,小括号优先。

(a++) 是 表达式,按运算规则,不能对表达式作自增运算。所以编译出错。

3.下面四个表达式中错误的一项是?

A a+=(a++)

B a+=(++a)

C (a++)+=a

D(++a)+=(a++)

A: a+=(a++)    先计算a++ ,因为a为后++,a左边是左值不会报错 ;

B: a+=(++a)    先计算++a,因为a为前++,a左边是左值不会报错 ;

C::(a++) += a  这个是错误的。因为左值只能是变量,不能是表达式,(a++)是后++,所以a不会先计算a++,是表达

式,所以会报错。 

D:(++a) +=(a++) 先计算++a,然后再去计算a +=(a++) ,所以左边也是左值。

4.#include <stdio.h>

   int d = 1;

   void fun( int p)

{

 int d = 5;

d += p++;

printf("%d",d);

}

main()

{

 int a = 3;

fun(a);

d += a++;

printf("%d\n",d);

}

这一题主要是局部变量与全局变量的区别:

先看函数里面: 

最终要输出d的值,而p++的意义是1)先执行d=d+p,2)再在执行下一步printf的时候同时执行p++;所以这个函数关

于d只做了一个d=d+p的操作; 

然后再看函数外面: 

已定义d=1;这里的d是全局变量,生命周期到全程序结束。 

再看main函数: 

(1)a=3; 

(2)在局部变量d=5,p=a=3的情况下,执行d=d+p,d的值为8,输出; 

(3)在全局变量d=1,a=3的情况下,执行d=d+a,d的值为4,输出; 

所以结果为8,4。

5.#include<stdio.h> 

void main() 

{

   char w[20]; 

   char a[5][10] = { "abcdef", "ghijkl", "mnopq", "rstuv", "wxyz"} ;  

    int p[6][2] = { {0,1},{1,5},{0,0},{0,2},{1,4},{4,4}}, i ; 

    for (i=0; i<6; i++) 

       w[i] = a[p[i][0]][p[i][1]]; 

}

printf(w);

}

输出结果为?

程序首初始化字符数组a[ 5 ][ 10 ]和二维数组p [ 6 ] [ 2 ] 。

执行for循环语句,循环变量i从0取值到5,得到字符数w [ ]的值,并通过字符串输出函数puts进行输出操作。

w [ 0 ] = a [ 0 ] [ 1 ],w [ 1 ] = a [ 1 ] [ 5 ],w [ 2 ] = a [ 0 ] [ 0 ],w [ 3 ] = a [ 0 ] [ 2 ],w [ 4 ] = a [ 1 ] [ 4 ],w [ 5 ] = a[ 

4 ] [ 4 ],因此最后字符数组w的结果为black。

6.int f(unsigned int n)

{

 unsigned int m = 0;

 for(m = 0;n;++m)

{

n&=(n-1);

}

return m;

}

f(2486)的返回值是?

n&=(n-1)相当于n=n&(n-1),执行一次也就相当于把二进制中的最低位的1置为0;循环执行,也就是计算2468的二进

制中有多少个1。

2468=2048+256+128+32+16+4+2,所以一共有7个1。






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值