十进制数157的16位原码是▁▁▁ ,补码是▁▁▁;十进制数-153的16位原码是▁▁▁,补码是▁▁▁。
对原码从右往左数,直到遇到第一个数字1,1及1右边的数不变,1左边的数字按位求反。
对有符号类型的数,第一位为1代表负数,为0代表正数。
(4) const long y; 是错误的
const 类型名 标识符 =常量
0.L 、3.F 是浮点型常量
浮点型常量既可以小数点开头,也可以小数点结尾。
没有后缀时其类型为double,后缀f或F指定float常量,后缀I或L指定long double常量。
1.E-5是浮点型常量
相当于1.0x10^5
0377UL 、 2L是整型常量
后缀ul表示unsigned long,l表示long。注意无后缀时一般表示int。
‘\18’是非法常量
而‘\45’是字符常量
从0到31的字符码和字符码127是控制字符,不可打印,其余为可打印字符。
nl=nw=nc=0;
等价于
nl=(nw=(nc=0)) ;
设变量说明为:
int a=1,b=2,c=3,d;
double x=2.0,y=7.7;
分别计算填空题1-9中表达式的值。
d = y += 1/x; d = ▁▁▁
答案为8
注意d是int型,8.2要舍去小数得到8。
设i和j是int类型,a和b是double类型,判断1-10题中表达式的正误。
C对unsigned类型就是直接逻辑移位,而对有符号类型左移用逻辑左移(算术左移和逻辑左移是一样的),右移则用算数右移。
-n左移一位是-2n
设变量说明为:
unsigned short x=1,y=2,z=4,mask=0xc3,w;
short v;
v =~x ▁▁▁
答案为2
x为无符号短整型,00000000 00000001,
取反,得到11111111 11111110,
此时它是一个负数,需要再求其补码,
得到00000000 00000010,即为2。
负数总是很特殊,需要求补码。
%%表示的是百分号本身。
即使浮点常量取得是整型值,在书写时也最好为它加上一个显式的小数点,这样可以强调其浮点性质。
char t[100]=hello
printf("%s",&t[1]) (必须有取址符号)输出的结果是ello
字符串把从第二个字符,一直到串尾的‘\0’打印出来。
&t[1]相当于t+1,意思都是:第一个元素后的1个元素 的地址。
如果是“%c”,只取一个字符。
可以在调试程序时跟踪程序的执行
#define DEBUG
...
#ifdef DEBUG
printf("x=%d\n",x);
#endif
...
#ifdef DEBUG
printf("y=%d\n",y);
#endif
对于声明int (*pf(char *))[5];描述正确的是:
pf是一个函数指针,指向的函数的返回值为指向有5个int元素的数组的指针。
设p是3个元素的函数指针数组,函数指针数组中每个元素所指向的函数是无参字符指针函数;正确的声明语句为:
B.char *(*p[3])()
对于声明int *pf(float(*a)(int));描述正确的是:
pf是一个函数,返回值为int *指针,参数为一个函数指针
根据结合律,pf先和右边的括号结合,因此pf不是函数指针,而是函数。
设p是9个元素的指针数组,数组中每个元素是指向有一个整型参数、返回值为双精度浮点型数的函数的指针;正确的声明语句为:
double (*p[9])(int)
看上边的解析即可。
去掉*p:
方法:从左往右,从里往外。
#define STRING char*
typedef char * string;
STRING a,b;
string c,d;
a,c,d都为字符型指针,而b为字符。
设有如下声明:
struct T{
int a[3], *pa;
char b[20], *pb;
}s={
{
-1,0,1},s.a,"abcdef",s.b},*ps=&s;
ps->pa[1]++ 0
++前置式才需要加1,后置式不需要加1.
++*++ps->pa 1
ps->pa 访问pa指针,指向数组首元素,自增,指向数组第二个元素,间接访问,值为0,0再自增,值为1
*(++s.pb)+2 d
注意,*p++相当于 *(p++)。
故 * (++s.pb)+2相当于 *((++s.pb)+2)
s.pb为指向字符串首元素的指针,++后指向第二个元素,再加2,指向第四个元素,间接访问,即为d。
(++s.pb)[3] e
++s.pb为第二个元素的地址,后边[3]表示再数三个元素,并间接访问,即访问第五个元素,为e。