在C ++中,什么原因导致赋值在控件结构中使用时评估为true或false?

时间:2010-01-05 02:59:21

标签: c++

那么有人可以帮助我掌握if(...)或while(...)之类的作业中的所有(或大部分相关)情况吗?

我的意思是:

if(a = b)

while(a = &c)
{
}

等...

什么时候评价为真,何时评价为假?根据作业中使用的类型,这会发生变化吗?什么时候有指针参与?

感谢。

6 个答案:

答案 0 :(得分:15)

在C ++中,归因评估为归属的值:

int c = 5; // evaluates to 5, as you can see if you print it out
float pi = CalculatePi(); // evaluates to the result
                          // of the call to the CalculatePi function

所以,你发表声明:

if (a = b) { }
while (a = &c) { }

大致相当于:

a = b
if (b) { }
a = &c
while (&c) { }

相同
a = b
if (a) { }
a = &c
while (a) { }

当他们不是布尔人时,那些if (a)等等呢?好吧,如果它们是整数,则0为假,其余为真。这个(一个“零”值 - > 真)通常成立,你应该真正引用一个C ++引用(但要注意写{{1} }并不比if (a == 0)困难得多,对读者来说要简单得多。)

无论如何,你应该总是避免模糊代码的副作用

你应该从不需要做if (!a):你可以用更清晰的方式达到完全相同的东西,这看起来不会是一个错误(如果我读了一个像if (a = b)这样的代码,我想到的第一件事就是编写错误的开发人员;第二件,如果我三重检查它是正确的,那就是我讨厌他!: - )

祝你好运

答案 1 :(得分:5)

赋值“operation”也返回一个值。它是表达式的类型和值。如果由if类型语句处理:

  • while (expr)
  • do ... until (expr)
  • if (expr)
  • 或三元运算符(expr)?(真值):false值

评估expr。如果它不是零,那是真的。如果为零,则为假。

答案 2 :(得分:1)

赋值的返回类型是左手值,它允许编译a = b = c之类的语句。在您的示例中:

while(a = &c)
{
}

在“a”为真后,在为其指定值& c。

后返回true

答案 3 :(得分:0)

在您列出的两个示例中,如果a在赋值后非零,则括号内的值将被计算为true。

在更常见的情况下,您将变量与常量进行比较,以避免此问题,某些编码标准要求您首先编写常量。

if(A_CONSTANT = var_a)

这将被编译器捕获,而

if(var_a = A_CONSTANT)

不会。

答案 4 :(得分:0)

if (a = b)
    ...

是:

的简写
a = b;
if (a != 0)
    ...

在while语句中,条件内的赋值启用DRY原则:

while (a = b)
{
    ...
}

是简写(注意我必须复制作业,以便在条件检查之前完成):

a = b;
while (a != 0)
{
    ...
    a = b;
}

那就是说,像这样的代码的一个经典问题是知道代码是否打算进行赋值,或者当意图写'=='时代码是否忘记了'='(即应该是{{ 1}}。

因此,你永远不应该只写一个简单的作业(gcc会发出一个警告,例如“建议使用作为真值的作业的括号”)。如果你想在控制结构中使用赋值,你应该总是用额外的括号括起来并明确地添加不等于:

while (a == b)

答案 5 :(得分:0)

赋值语句求值为赋值给的变量的新值(禁止operator =的奇异重载)。如果赋值发生在布尔上下文中,那么它将取决于该值的类型如何处理。如果该值是bool,则当然将其视为bool。如果该值是数值,则将非零值视为true。如果值是指针,则将非NULL值视为true。如果它是一个对象,编译器将尝试将其转换为布尔值(例如operator bool)。如果不可能,编译器将尝试将对象转换为可转换为bool的值(例如指针类型或数字类型,如int)。最后,如果没有要执行的转换,或者有多个可能的转换(例如,对象定义了operator int和operator foo *),代码将无法编译。