我无法理解5-0-13规则本身:
规则5-0-13:if语句的条件和iteration语句的条件应该具有bool类型。
原理:如果在if-statement或iteration-statement的条件中使用了非bool类型的表达式,则其结果将隐式转换为bool。 条件表达式应包含显式测试(产生bool类型的结果),以便阐明开发人员的意图。
异常:表单type-specifier-seq声明符的条件不需要具有bool类型。 之所以引入这个例外,是因为实现相同效果的替代机制繁琐且容易出错。
extern int32_t * fn ( );
extern int32_t fn2 ( );
extern bool fn3 ( );
while ( int32_t * p = fn ( ) ) // Compliant by exception
{
// Code
}
// The following is a cumbersome but compliant example
do
{
int32_t * p = fn ( );
if ( NULL == p )
{
break;
}
// Code...
}
while ( true ); // Compliant
while ( int32_t length = fn2 ( ) ) // Compliant by exception
{
// Code
}
while ( bool flag = fn3 ( ) ) // Compliant
{
// Code
}
if ( int32_t * p = fn ( ) ) // Compliant by exception
if ( int32_t length = fn2 ( ) ) // Compliant by exception
if ( bool flag = fn3 ( ) ) // Compliant
if ( u8 ) // Non-compliant
if ( u8 && ( bool_1 <= bool_2 ) ) // Non-compliant
for ( int32_t x = 10; x; --x ) // Non-compliant
。。。它和
规则5-3-1:! 运算符,逻辑&&P; 或者逻辑运算符的类型应为bool
原理:在这些运算符中使用除bool以外的类型的操作数不太可能有意义(或有意)。 此规则允许检测此类使用,因为逻辑运算符(&&&,和!) 很容易与按位运算符(&;,和~)混淆。
if ( ( a < b ) && ( c < d ) ) // Compliant
if ( 1 && ( c < d ) ) // Non-compliant
if ( ( a < b ) && ( c + d ) ) // Non-compliant
if ( u8_a && ( c + d ) ) // Non-compliant
if ( !0 ) // Non-compliant –
// also breaks other rules
if ( !ptr ) // Non-compliant
if ( !false ) // Compliant with this rule,
// but breaks others
规则5-3-1还适用于if
,while
和for
之外的情况,例如。
extern void set_flag(bool);
set_flag( ( a < b ) && ( c < d ) ); // Compliant
set_flag( 1 && ( c < d ) ); // Non-compliant
set_flag( ( a < b ) && ( c + d ) ); // Non-compliant
set_flag( u8_a && ( c + d ) ); // Non-compliant
set_flag( !0 ) // Non-compliant –
// also breaks other rules
set_flag( !ptr ); // Non-compliant
set_flag( !false ); // Compliant with this rule,
// but breaks others
bool one = ( ( a < b ) && ( c < d ) ); // Compliant
bool two = ( 1 && ( c < d ) ); // Non-compliant
bool three = ( ( a < b ) && ( c + d ) ); // Non-compliant
bool four = ( u8_a && ( c + d ) ); // Non-compliant
bool five = ( !0 ); // Non-compliant –
// also breaks other rules
bool six = ( !ptr ); // Non-compliant
bool seven = ( !false ); // Compliant with this rule,
// but breaks others