dxmnet 阅读(1096) 评论(6)

问题一,
char *p = new char[32];
p+=5;
(-2)[p]=32;

第三行,会导致一个编译错误吗?其实不是的。
p[-2] == *(p+(-2)) == (-2)[p]
不信你可以测试。

问题二,
if( a < b )
a = val();
else if( b < c )
b = val();
else
c = val();
可以写得更简单吗?
答案: (a<b?a:b<c?b:c)=val();
原因是,表达式是左值的。(就是可以写在赋值号的左边)

问题三,为了统计选了几个项
int ctr = 0;
for( int i = 0; i < 8; ++i )
if( options & 1<<(8+i) )
if( ctr++ )
{
cerr << "Too many options selected";
break;
}

这是一个很笨的办法。用下面的代码就可以简单地实现。

typedef unsigned short Bits;
inline Bits repeated( Bits b, Bits m ){ return b & m & (b & m)-1; }
if( repeated( options, 0XFF00 ) )
cerr << "Too many options selected";

以上内容来自 《C++语言99个常见编程错误》
http://book.51cto.com/art/201001/177179.htm
下载链接 http://download.csdn.net/source/2194273


评论列表
周星星
对于问题三
b & m & (b & m)-1
估计你其实想写的是 b&m & (b&m-1)

////////////////////////////
判断一个数是不是2的整数倍 的算法是: a & (a-1)
大虾米(dxm)的技术博客
减号的优先级比&高,我的写法是对的。周老师的可能错了。
这不是判断一个数是不是2的整数倍,而是判断该数的二进制,是否仅有1个位是1,其他位都是0
笨笨猪
re: 你所不知道的C++
不知说点儿什么。
为什么很多支持java的人老是对C++指手画脚,这很大程度上是因为我们把C++不好的特性“发扬光大”了。
周星星
re: 你所不知道的C++
这不是判断一个数是不是2的整数倍,而是判断该数的二进制,是否仅有1个位是1,其他位都是0
------ 两者是等价的
如果一个数是2的整数倍,则其二进制形式中,最多仅有一个位的值为1。

因为我们把C++不好的特性“发扬光大”了
------ 谈不上好和不好,平常心看待,不支持不反对
WhenSoWeWent
re: 你所不知道的C++
问题二的反汇编结果一样吗
brent
re: 你所不知道的C++
忍不住要喷, 你的代码都要编译, 不去了解编译器做的优化等,在此刷小刀, 一点意思也没有, 好的代码是可交接的, 艺术的, 可读性强的,呵呵

发表评论
切换编辑模式