那么有人可以帮助我掌握if(...)或while(...)之类的作业中的所有(或大部分相关)情况吗?
我的意思是:
if(a = b)
或
while(a = &c)
{
}
等...
什么时候评价为真,何时评价为假?根据作业中使用的类型,这会发生变化吗?什么时候有指针参与?
感谢。
答案 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为假,其余为真。这个(一个“零”值 - > if (a == 0)
困难得多,对读者来说要简单得多。)
无论如何,你应该总是避免模糊代码的副作用。
你应该从不需要做if (!a)
:你可以用更清晰的方式达到完全相同的东西,这看起来不会是一个错误(如果我读了一个像if (a = b)
这样的代码,我想到的第一件事就是编写错误的开发人员;第二件,如果我三重检查它是正确的,那就是我讨厌他!: - )
答案 1 :(得分:5)
赋值“operation”也返回一个值。它是表达式的类型和值。如果由if
类型语句处理:
while (expr)
do
... until (expr)
if (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 *),代码将无法编译。