La respuesta de user143506 es correcta, pero para un posible problema de rendimiento que comparó los possibilies en asm:
return x;
, return x != 0;
, return !!x;
e incluso return boolean_cast<bool>(x)
resultados en esta perfecto conjunto de instrucciones asm:
test edi/ecx, edi/ecx
setne al
ret
Esto se probó para GCC 7.1 y MSVC 19 2017. (Solo el booleano_convertidor en MSVC 19 2017 da como resultado una cantidad mayor de código asm, pero esto es causado por la templatación y las estructuras y puede descuidarse desde el punto de vista del rendimiento, porque el mismo lin es como se indicó anteriormente puede duplicarse para diferentes funciones con el mismo tiempo de ejecución.)
Esto significa que no hay diferencia de rendimiento.
PS: Se utilizó este boolean_cast:
#define BOOL int
// primary template
template< class TargetT, class SourceT >
struct boolean_converter;
// full specialization
template< >
struct boolean_converter<bool, BOOL>
{
static bool convert(BOOL b)
{
return b ? true : false;
}
};
// Type your code here, or load an example.
template< class TargetT, class SourceT >
TargetT boolean_cast(SourceT b)
{
typedef boolean_converter<TargetT, SourceT> converter_t;
return converter_t::convert(b);
}
bool is_non_zero(int x) {
return boolean_cast<bool>(x);
}
supongo que la pregunta es por qué el primero no causa una C4800 o bien ya que incluso "Echando la expresión de tipo bool no va a desactivar la advertencia, que es por diseño." (MS) – Tobias
um, esto de hecho tiene su lugar ... las personas confunden C++ y C –
Después de la doble negación, se garantiza que el valor es 0 o 1; el valor original puede ser cualquier valor int. –