c ++中的布尔乘法?

Vin*_*ent 13 c++ boolean standards-compliance ternary-operator

考虑以下:

inline unsigned int f1(const unsigned int i, const bool b) {return b ? i : 0;}
inline unsigned int f2(const unsigned int i, const bool b) {return b*i;}
Run Code Online (Sandbox Code Playgroud)

语法f2更紧凑,但标准是否保证f1并且f2严格等同?

此外,如果,如果我想编译器优化这个表达式b,并i在编译时已知,哪个版本我更喜欢哪个?

AnT*_*AnT 11

嗯,是的,两者都是等价的.bool是一个整数类型,true保证转换为1整数上下文,同时false保证转换为0.

(反之亦然,即保证非零整数值转换为true布尔上下文,而保证零整数值转换为false布尔上下文.)

由于您正在使用无符号类型,因此可以很容易地提出其他可能基于位错误但又完全可移植的同类内容的实现,例如

i & -(unsigned) b
Run Code Online (Sandbox Code Playgroud)

虽然一个体面的编译器应该能够为您的任何版本选择最佳的实现.

PS虽然令我惊讶的是,GCC 4.1.2几乎字面上编译了所有三个变体,即它在基于乘法的变体中使用了机器乘法指令.它足够聪明,可以使用变量cmovne上的指令?:使其无分支,这很可能使它成为最有效的实现.


P.P*_*.P. 6

是.它是安全的假设true1false0在表达式中使用时,为你做的,并保证:

C++ 11,Integral Promotions,4.5:

bool类型的rvalue可以转换为int类型的rvalue,false变为零,true变为1.