【问题标题】:c++ what is the correct syntax here?c ++这里的正确语法是什么?
【发布时间】:2012-04-20 12:01:16
【问题描述】:

检查变量值然后在相同条件下设置变量同时检查新设置变量 var 的正确语法是什么,全部在一个 if 语句中?

基本上是这样的

if(this->somevar > 0 && this->newvar = this->GetNewVar(this->somevar),this->newvar > 0)

我知道这不是正确的语法,或者至少它对我不起作用,因此我以这个主题为例,所以如果this->somevar 为 null 或 0,我不希望它执行下一个条件&& this->newvar = this->GetNewVar(this->somevar,this->newvar,但跳过该语句并忽略该部分。

这样的正确语法是什么?

【问题讨论】:

  • 已经好了。运算符 && 具有短路语义。如果左边的条件为假,它就停在那里,因为完整的表达式永远不会为真。
  • 你为什么要做这样的事情?为什么不嵌套ifs?
  • 这段代码是在派生模板类中还是什么?如果您能够省略所有this->,它将更具可读性。
  • 当你知道如何在两个语句中做事,但不是在一个语句中,那么这是一个非常强烈的迹象,你应该把它写在两个语句中,因为它在一个语句中变得难以理解。
  • @PlasmaHH:同意。将两个这样的语句合二为一通常没有明显的好处。您最终可能会得到更难以阅读和维护的代码。此外,如果您在条件内赋值,您可能会收到编译器警告。

标签: c++ visual-c++


【解决方案1】:

&& 是一个短路求值的算子,如果左边为真则不执行右边部分。 但是你为什么不简单地写:

if(this->somevar > 0)
{
  this->newvar = this->GetNewVar(this->somevar);
  if (this->newvar > 0)
  {
    ...

这肯定会让事情变得更清楚......

【讨论】:

  • 通常的说法是&& 具有“短路行为”。 “顺序运算符”可能会与“顺序运算符”混淆。
【解决方案2】:

如果 this->somevar 的计算结果为零,则逻辑 AND && 运算符会短路,这意味着在这种情况下不会计算 if 表达式的其余部分

【讨论】:

    【解决方案3】:

    逗号后面的表达式不是必须的。此外,还缺少一件事,括号周围的作业:

    if(this->somevar > 0 && (this->newvar = this->GetNewVar(this->somevar)) > 0)

    如果没有括号,您最终可能会将 this->newvar 设置为布尔表达式的值 this->GetNewVar(this->somevar),this->newvar > 0,它将被评估为布尔结果(当转换为 this->newvar 的类型时,根据编译器的不同,true/false 又可以转换为 0 或 1 或 -1)。

    【讨论】:

    • 使用逗号操作符是没有意义的,因为赋值返回的是赋值; if (somevar > 0 && (newVar = foo()) > 0) 完成这项工作。
    【解决方案4】:

    我认为只有逗号后的位被评估为 if 条件。逗号左边的表达式被忽略。

    int main() {
            if( false, true) { cout << " got to if( false, true ) "; }
            if ( true, false ) { cout << "got to if( true, false ) "; }
    }
    

    要回答您的问题,您可以在逗号左侧放置任何内容并执行您喜欢的任何操作,只要您要评估的表达式是列表中的最后一个表达式。

    所以 if ( exp1, exp2, exp3 , exp4 ) dowhatever();仅在 exp4 为真时运行。为了可读性,您应该真正在 if 条件之外运行 exp1 到 exp3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      相关资源
      最近更新 更多