求大神解决下这么写的max和min函数
int max(int a,int b)
{
return *( &a+(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
int min(int a,int b)
{
return *( &b-(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
[解决办法]
int max(int a,int b)
{
return *( &a+(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
这个是很讨巧的方法,直接返回前一个地址的值还是后一个地址的值,也就是说,如果a>b,那么就会返回a地址对应的值
[解决办法]
[解决办法]
1.unsigned(a-b)>>(sizeof(int)*8-1) 等价为 a>=b?0:-1
2.函数入栈顺序为从右往左 b=*(&a-1)
3.不同的编译器可能第二条处理不同 所以。。
不推荐这样写,不过学习还是可以的!
[解决办法]
我也来说说自己的见解吧
比如max这个:
首先 unsigned(a - b)可得到一个数,如果a > b,则最高位为0,如果a < b,最高位为1(负数),接着后面位移31为(sizeof(int) - 1),只留下了最高位,所以结果为0或者1
然后利用c语言函数压栈的规则,b的地址大于a得地址,如果a < b,则会+1移动到b,取出b的数据,如果a > b,则不移动,取a的值
[解决办法]
int max(int a,int b)
{
return *( &a+(unsigned(a-b)>>(sizeof(int)*8-1)) );
}
这个是很讨巧的方法,直接返回前一个地址的值还是后一个地址的值,也就是说,如果a>b,那么就会返回a地址对应的值
这个正解,*就是取值的,里面有个&是取地址的!所以,直接……你懂得
[解决办法]
对了,from Suse 10 /usr/include/linux/kernel.h
- C/C++ code
# uname -r2.6.16.46-0.12-smp# cat /etc/SuSE-releaseSUSE Linux Enterprise Server 10 (x86_64)VERSION = 10PATCHLEVEL = 1