C语言笔试面试题收藏

********************************************************************************

********************************************************************************

2、两个整型数,不准用if 、switch 、?:等判断语句求出两者最大值,说出你的思路,能写出代码更好。

答:利用两数相减的结果的二进制表示中最高位为0或1来解决这个问题。

/**********************************************************************
 * Compiler: GCC
 * Last Update:  Tue 01 May 2012 07:31:44 PM CST
 ************************************************************************/
#include <stdio.h>

int main(int argc, char **argv)
{
    int a = 3, b = 4;
    int m[2];
    int bigger;

    m[0] = a;
    m[1] = b;
    bigger = m[((a-b)>>31) & 1];
    printf("%d\n", bigger);

    return 0;
}

如果a>b,则a-b的二进制表示中最高位为0,(a-b)>>31 = 0;bigger = m[0];

如果a<b,则a-b的二进制表示中最高位为1,(a-b)>>31 = 1;bigger = m[1];

********************************************************************************

3、

/**********************************************************************
 * Compiler: GCC
 * Last Update:  Tue 01 May 2012 07:31:44 PM CST
 ************************************************************************/
#include <stdio.h>

int  func(int i,int n)
{
    return (i<n && printf("%d\n",i)) && !func(i+1,n)
            || printf("%d\n",i);
}
int main(int argc, char **argv)
{
    func(4, 8);
    return 0;
}
仔细观察一下就可以发现return始终返回1。
因为:i<n && printf("%d\n",i)) && !func(i+1,n) || printf("%d\n",i)
可以看做: exp1 && exp2 && exp3 || exp4,由于exp4是printf()的返回值,即实际打印的字符数,始终是一个非零值,所以不管前面的exp1,exp2,exp3的值什么,这个总表达式(exp1 && exp2 && exp3 || exp4)的值总是为1,也就是return始终返回1,也就是fun(i,n)的返回值始终为1.

如果i >= n,则等价于 0 && printf("%d\n",i)) && !func(i+1,n) || printf("%d\n",i)
由于&&的短路性质,等价于 0 || printf("%d\n",i),即打印 i 的值。

如果i < n,则等价于 1 && printf("%d\n",i)) && !func(i+1,n) || printf("%d\n",i)
所以按顺序执行过去,先打印一个 i ,随后递归 !func(i+1,n),在递归里一样处理,打印i + 1,进入第二次递归;打印i + 1 + 1,进入第三次递归。。。
一直到i = n为止,此时打印i,也就是打印n ,然后第一次返回,返回值为1。
在第一次返回的上下文中:i = n - 1, 由于func(i+1,n) 返回值恒等于1,所以!func(i+1,n)恒等于0,原来的总表达式等价于exp1 && exp2 && 0 || printf("%d\n",i),不管exp1和exp2的值为什么,这里都会执行最后的打印语句,而这里的i = n - 1,所以打印n - 1。
然后第二次返回,此时i = n - 2,打印n - 2。
第三次返回,打印 n - 3.
一直到i为最初的i,此时再打印一次i。

运行结果:

4
5
6
7
8
7
6
5
4
********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************

********************************************************************************




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值