常见的面试题(整理)

下面程序的输出结果?

#include<stdio.h>
 
int main(void)
{
    int i = 300;//300 = (00000001 00101100)二进制
    char *ptr = (char*)(&i);// *ptr = 00101100 = 44   ptr指向低八位
    *++ptr = 2;// 00000001 变为 00000010   ++ptr指向高八位
    printf("%d\n",i);//i= (00000010 00101100) 二进制 = 556
    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。

#include <stdio.h>
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语音的整数自动转换原则。当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此,从这个意义上讲,无符号数的运算优先级要高于有符号数。

linux中fork()函数详解(原创!!实例讲解)http://blog.youkuaiyun.com/jason314/article/details/5640969  不错的博客

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
    int num = 0;
    pid_t pid = fork();
    num +=1;
    if(pid ==0)
    {
        sleep(2);
	printf("%d\n",num);
    }
    else
    {
	sleep(4);
	printf("%d\n",num);
    }
    return 0;
}
输出结果为:
(隔4秒)1
(隔2秒)1
原因分析:fork一个进程会复制父进程的大部分资源,比如堆指针、栈指针和标志寄存器。但有些特性还是子进程所特有的,子进程中会把父进程的信号号位图清除。因为子进程复制了父进程的数据,所以这里打印了两次1.

基础知识:

1)fork函数总是“调用一次,返回两次”,在父进程中调用一次,在父进程和子进程中各返回一次。fork在子进程中的返回值是0,而在父进程中的返回值则是子进程的id。
2)子进程在创建的时候会复制父进程的当前状态(PCB信息相同,用户态代码和数据也相同)。
3)程序运行的结果基本上是父子进程交替打印,但这也不是一定的,取决于系统中其它进程的运行情况和内核的调度算法。

#include <stdio.h>
int main(void)
{
	static int i = 5;
	if(--i)
	{
		main();
		printf("%d",i);
	}
	return 1;
}

输出结果:0000
原因分析:该问题涉及到递归和静态变量。Static变量i在每次调用时,并不会进行重新赋值,存储在数据段,所有的调用共享同一个i.

#include <stdio.h>
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


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值