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。