分类: C/C++
2015-02-13 15:19:00
1. 下面程序的输出结果?
#include
#include
int main(void)
{
unsigned int i;
for(i=1;i>-2;i--)
{
printf("C aptitude\n");
}
return 0;
}
结果:没有任何的输出。
原因分析:在程序中定义了unsigned int i;i是一个无符号的类型变量,当无符号的类型变量变和有符合的类型变量进行比较是,也就是1和-2进行比较,-2会自动转变无符号整数,也就是转换为4294967294。所以for循环不会执行,不能打印出 C aptitude。
这里主要涉及到C语音的整数自动转换原则。当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此,从这个意义上讲,无符号数的运算优先级要高于有符号数。
例子2:
#include
#include
int main(void)
{
int i = 300;
char *ptr = &i;// *ptr = 44 101100--------(1)
*++ptr = 2;// ++ptr 指向00000001 mod 00000010 ----------(2)
printf("%d\n",i);
return 0;
}
结果:556
原因分析:在代码(1)中定义了一个char型的指针类型,指向了变量i。整数300的二进制为00000001 00101100,在代码(1)中根据Gdb的调试,打印出的*ptr=44,300存储在内存中的格式如果是小端的话为:00101100 00000001 指向的是内存中的前一个字节,也就是前八位。在语句(2)中++ptr指向了00000001后八位,然后赋值为2,00000001 修改为00000010,所以这是i为00000010 00101100,十进制为556。
例子3:
#include
#include
#include
#include
#include
int main(void)
{
int num = 0;
pid_t pid = fork();
if(pid ==0)
{
sleep(2);
}
num +=1;
printf("%d\n",num);
sleep(4);
return 0;
}
输出结果为:
1
1
原因分析:fork一个进程会复制父进程的大部分资源,比如堆指针、栈指针和标志寄存器。但有些特性还是子进程所特有的,子进程中会把父进程的信号号位图清除。因为子进程复制了父进程的数据,所以这里打印了两次1.
例子4:
#include
#include
int main(void)
{
static int i = 5;
if(--i)
{
main();
printf("%d",i);
}
return 1;
}
输出结果:0000
原因分析:该问题涉及到递归和静态变量。Static变量i在每次调用时,并不会进行重新赋值,存储在数据段,所有的调用共享同一个i.
例子5:
#include
#include
int main(void)
{
int i = 0;
for(;i++;printf("%d",i));
printf ("i = %d\n",i);
return 0;
}
输出结果:i=1
原因分析:在进入循环后,判断条件为i++时,这时候的i为0,不成立,所以不会执行printf("%d",i),所以输出结果为i=1