Implicit bool evaluation with if conditions
我有一个称为"count"的整数,它在满足某个条件时递增。所以我想问如果你写下这个条件会发生什么:
1 2 3 4 5 6 7 8
| if(count % 2)
{
return even_bit;
}
else
{
return odd_bit;
} |
问题主要是询问上面的条件是检查条件计数%2=0还是计数%2!=0,如果在整型数据类型变量的表达式中没有显式定义它。
- 为什么不能编译和运行代码呢?
- 0为false,其它整数值为true。
- 你所说的"这些条件中哪一个得到评估"是什么意思?我只看到一个条件。
- 在C语言编程中,程序员使用的是0和1,而不是假和真,C++有数据类型BoOL,可以定义EDCOX1,3,但是,例如,最后,你可以使用0和1。
- 恐怕这个问题很清楚。你在问%是做什么的吗?
- 基本上询问是否(计数%2):这里的条件是否等于说如果(计数%2!=0)。很抱歉弄混了。
- 在C中使用布尔值有很多答案和解释。请在询问之前搜索网站。
如果表达式的计算结果为0,它将被解释为FALSE—对于任何非零值,它将被解释为TRUE。换言之,
等于
所以你的代码是"向后"的。如果声明是真的,那么count是奇数,您很可能希望返回odd_bit(此处仅作猜测)。
- 当然,这就是为什么你根本不想像他那样写。如果表达式有bool类型,那么它是好的(事实上,任何进一步的比较,如true或false都是混淆的)。如果它不是bool,那么您不需要依赖于某种模糊和混淆的隐式转换,而是编写您想要的转换。
- @Jameskanze这是个意见问题。我通常喜欢避免不必要的比较,尤其是当涉及到%运算符时。%运算符的结果是余数。对该结果的布尔运算回答了一个问题,即是否存在余数。
- @jameskanze许多C程序设计人员也习惯于其他操作员使用常见的习惯用法,例如,与if (flag & MY_FLAG_NAME == MY_FLAG_NAME)等相比,if (flag & MY_FLAG_NAME)通常也更可取。
- 非常感谢。这回答了我的问题。它是我正在设置的偶校验位,当奇数个数时为1。
- 很高兴能帮上忙。希望您认识到这个函数不会返回count的奇偶校验位。为此你必须做一些更高级的工作。例如,请参阅stackoverflow.com/questions/19373034/…,了解一种方法(以及一些解释,包括我自己的精彩的一个……-)
- "帕维尔?"我不认为这是意见的问题,而是隐藏重要的信息(换句话说,模糊)。有一个到bool的隐式转换,隐式转换通常使代码的可读性变差。if选择的不是是否有余数,而是表达式的计算结果是否为真。使用一些自创的其他定义,比如"有一个重塑者"就是混淆,不管它是否有效。
- "帕维尔?"很多C程序员都有坏习惯。甚至在我学习C(20世纪80年代)的时候,我们就已经足够了解写if ( (flag & MY_FLAG_NAME) != 0 )。(虽然我知道一些例外,但我怀疑大多数写好C的人已经转向C++了。今天真的没有理由用C。)
- @Jameskanze是的,一直有程序员认为他们的习惯是好的,其他人都错了。宗教和技术不太协调。
- "帕维尔?"伊默达,这不是宗教或习惯的问题。这是一个表达清楚与否的问题。
- 在这件事上我和詹姆斯在一起。清晰性每次都胜过代码的紧凑性——今天再键入几个字符,明天就省去了大量的痛苦。是为-Wall -pedantic旗。
- @我尊重别人的感受和意见,即使他们和我的不一样。我个人认为if (flag & MY_FLAG_NAME)比if ( (flag & MY_FLAG_NAME) != 0)可读得多,这是一个非常基本的版本。一旦这些行变得越来越长、越来越复杂,例如,在中使用== 0,在与中使用no,句子的意思就会颠倒。但这并不意味着我想把它变成宗教。
等于
现在,它将取决于count是偶数还是奇数。偶数情况下,count%2为FALSE(返回odd_bit,如果count为奇数,则count%2为TRUE(返回even_bit)。
- 实际上,它相当于if ( static_cast( count % 2 ) )。实际上与if ( count % 2 != 0 )相同。我不知道第三种变体是从哪里来的。
- 第三个变量不正确,因为任何非零表达式的值都将为true。
- @是的,你是对的。