1、下面程序的输出结果是
int x=3; do { printf(“%d ”,x-=2); }while(!(--x));
输出:1
-2
解析:x初始值为3,第一次循环中运行printf函数,参数x -= 2的值为1,输出1,此时x = 1,进行判断!(-- x),x先自减1,为0,取非为1(真),进行第二次循环,x先减2,输出-2,此时x=-2,判断!(-- x),x先自减1为-3,取非为0(假),结束循环。
“!”取非操作:不管数值是多少,只要不是0,取非后则为0,若为0,则取非后为1
2、下面程序的输出结果是
void main(){ int a[]={1,7,12,15}; int *p1=a,*p2 = p1++; *p1 += *p2++; printf(“%d %d”,*p1,*p2); }
输出:8、8
解析:首先定义指针p1指向数组a首地址,然后定义指针p2,也指向数组首地址,然后p1自加,也就指向了数组第二个元素。*p1 += *p2++;语句先将p2指向的第一个元素的值加到p1指向的第二个元素的值上,也就是第二个元素值为8,然后p2自加,指向第二个元素(*p2++,*与++优先级相同,从右自左结合,先与++结合,表示语句执行完后p2指向下一个元素,然后与*结合,表示p2现在所指向的第一个元素的值)
3、下面程序的输出结果是
int func(int *p){ return (*p-- = 3) - 1; } void main(){ int arr[]={10,7,5}; int *p = arr + 1; printf(“%d”,func(p) + *p); }
输出:5
解析:p指针首先指向数组arr的第二个元素,首先调用func函数,将实参指针p指向的地址传递给函数形参p,形参执行*p-- = 3,使得p指向的数组第二个元素值为3,然后形参p自减指向第一个元素,但是实参p不变,还是指向第二个元素,此时func返回的值为3 - 1 = 2,然后2 + *p,这里实参p指向第二个元素,值为3
4、下面程序的输出结果是
long fib(int n) { if(n > 2) return (fib(n - 1) + fib(n - 2)); else return 2; //16年这里返回1,注意区别 } void main(){ printf(“%d ”,fib(3)); }
输出:4
分析:调用fib(3),由于3>2,所以返回fib(2)+fib(1),fib(2)和fib(1)都返回2
5、下面程序的输出结果是
void main() { char c = 48; int i,mark = 01; for(i = 0;i < 5;i ++) { printf(“%c”,c|mark); mark = mark << 1; } }
输出:12480
分析:C=48转换成二进制数就是110000,mark初始为八进制1,循环执行5次,每次先输出c|mark(按位或运算)对应的ASCII字符,然后mark左移1位,即乘以2。第一次循环c为110000,mark为1,c|mark为110001,即十进制49,对应ASCII字符‘1’,然后mark左移为2;第二次循环c|mark为110010,即十进制50,对应ASCII字符‘2’,然后mark左移为4;第三次循环c|mark为110100,即十进制52,对应ASCII字符‘4’,然后mark左移为8;第四次循环c|mark为111000,即十进制56,对应ASCII字符‘8’,然后mark左移为16;第五次循环c|mark为110000,即十进制48,对应ASCII字符‘0’,然后mark左移为32。
在C语言里,整数有三种表示形式:十进制,八进制,十六进制。
其中以数字0开头,由0~7组成的数是八进制。以0X或0x开头,由0~9,A~F或a~f 组成是十六进制。除表示正负的符号外,以1~9开头,由0~9组成是十进制。
1.十进制:除表示正负的符号外,以1~9开头,由0~9组成。如,128,+234,-278。
2,八进制:以0开头,由0~7组成的数。如,0126,050000.
3,十六进制:以0X或0x开头,由0~9,A~F或a~f 组成。如,0x12A,0x5a000.
6、
输出:12480
分析:
“!”取非操作:不管数值是多少,只要不是0,取非后则为0,若为0,则取非后为1
7、下面程序的输出结果是
void main(){ int a,b=0; static int c[10]={9,2,3,4,5,6,7,8,0,1}; for(a=0;a<10;a++) b+=c[a]; printf("%d",b); }
输出:45
分析:程序遍历数组c,将c的每个元素的值累加到b上
8、
struct Stu{ Int num; Int score; }; void main(){ struct Stu stu[3] = {{50,50}, {60,60}, {70,70}}; struct Stu *p; p = stu[0]; }
分析:问哪个选项是不对的?
选*p.num= 50,因为.的优先级高于*,而.是直接取值,改为(*p).num
9、改错
Void main() { char data[]="There are some mistakes in the program"; char *point; char array[30]; //数组长度不够
int i,length; length=0; while(data[1ength]!=' ') length++; //指针运算前没有赋值 for(i=0; i<length; i++,point++) // ‘