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

Met*_*uru 10 c++

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

我的意思是:

if(a = b)
Run Code Online (Sandbox Code Playgroud)

要么

while(a = &c)
{
}
Run Code Online (Sandbox Code Playgroud)

等等...

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

谢谢.

Bru*_*eis 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
Run Code Online (Sandbox Code Playgroud)

所以,你的陈述:

if (a = b) { }
while (a = &c) { }
Run Code Online (Sandbox Code Playgroud)

大致相当于:

a = b
if (b) { }
a = &c
while (&c) { }
Run Code Online (Sandbox Code Playgroud)

与...相同

a = b
if (a) { }
a = &c
while (a) { }
Run Code Online (Sandbox Code Playgroud)

if (a)当他们不是布尔人时,那些等等呢?好吧,如果它们是整数,则0为假,其余为真.这个(一个"零"值 - >假,其余 - >真)通常都有,你应该确实引用一个C++引用(但请注意,写入if (a == 0)并不比if (!a)阅读器简单得多) ).

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

永远不需要这样做if (a = b):你可以通过其他更清晰的方式实现完全相同的东西,这看起来不会是一个错误(如果我读到的代码就像if (a = b)我想到的第一件事那样是开发人员写道,这是一个错误;第二,如果我三重检查它是正确的,是我恨他!:-)

祝好运

  • 作为一种样式约定,大多数编译器会针对这种情况发出警告(类似"布尔上下文中的赋值"或"你的意思是==?"),并且很多人使用这种样式来表示赋值为测试的表达式是故意的:`if((a = b)){...}` (2认同)
  • 我个人更喜欢`if(static_cast <bool>(a = b)){}` - 使隐式转换显式化. (2认同)

wal*_*lyk 5

赋值"operation"也返回一个值.它是表达式的类型和值.如果由if类型声明处理:

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

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