【问题标题】:How does one declare a variable inside an if () statement? [duplicate]如何在 if () 语句中声明变量? [复制]
【发布时间】:2013-01-15 06:23:08
【问题描述】:

可能重复:
Declaring and initializing a variable in a Conditional or Control statement in C++

而不是这个...

int value = get_value();
if ( value > 100 )
{
    // Do something with value.
}

...是否可以将 value 的范围缩小到只需要它的地方:

if ( int value = get_value() > 100 )
{
    // Obviously this doesn't work. get_value() > 100 returns true,
    // which is implicitly converted to 1 and assigned to value.
}

【问题讨论】:

  • 你不能只做if(get_value() > 100) 吗?
  • @noko:如果你想对价值做点什么,那就不要了。
  • 你能再解释一下吗?你到底想做什么?
  • @MayankSharma:我不这么认为。
  • @MayankSharma:实际上,这不是你说的!

标签: c++


【解决方案1】:

如果你想要特定的价值范围,你可以引入一个范围块。

#include <iostream>

int get_value() {
    return 101;
}

int main() {
    {
        int value = get_value();
        if(value > 100)
            std::cout << "Hey!";
    } //value out of scope
}

【讨论】:

  • 喂!!!多么微风! +1 真正优雅的解决方案。
  • 我正要添加到我原来的问题,并编辑,“不引入范围块”,但我想现在为时已晚!
  • @DrTwox:如果您添加该限制,那么答案是“否”。
  • @DrTwox:你仍然可以这样做!
  • @PeterWood:其实不是这样
【解决方案2】:

你能声明一个变量并在if() 语句中比较它吗?没有。
您可以声明一个变量并以范围与if() 块紧密绑定的方式进行比较吗? 是的!


你可以或者声明一个变量:

if (int x = 5) {
   // lol!
}

你可以做事一个人:

int x = foo();
if (x == 5) {
   // wahey!
}

你不能两者都做!


可以稍微作弊,您唯一需要做的就是与true 进行比较,因为声明本身会评估新对象的值。

所以,如果你有:

int foo()
{
   return 0;
}

然后这个:

if (int x = foo()) {
    // never reached
}

相当于:

{
   int x = foo();
   if (x) {
       // never reached
   }
}

这个最终的语法,使用一个独立的作用域块,也是更复杂表达式的金子弹:

{
   int x = foo();
   if (x > bar()) {
       // wahooza!
   }
}

【讨论】:

  • @Hi-Angel:您是否对错误答案发表了评论?这似乎与我所说的无关。基本的if 语法没有什么“脆弱”的地方,它总是“有效”。
【解决方案3】:

把它放在一个函数中:

void goodName(int value) {
    if(value > 100) {
        // Do something with value.
    }
}

//...
    goodName(get_value());

【讨论】:

    【解决方案4】:

    改用for 怎么样?

    for (int value = get_value(); value > 100; value = 0) {
        //...
    }
    

    如果你想在上面使用 C++11,你可以使用 lambda:

    [](int value = get_value()) {
        if (value > 100) {
            //...
            std::cout << "value:" << value;
        }
    }();
    

    【讨论】:

    • 只写代码。
    • 因为这根本不容易出错或没有表达力。
    • 我认为 for (int value = get_value(); value > 100; value = 0) 会好一些。无需使用break
    • 为此使用 C++ lambda 是在需要订书机的地方使用锤子。过头了,我说。
    【解决方案5】:

    或者您可以为嵌套范围添加一组额外的大括号,尽管它并不完全漂亮:

    {
        int value = get_value();
        if ( value > 100 )
        {
            // Do something with value.
        }   
    }
    //now value is out of scope
    

    【讨论】:

      【解决方案6】:

      你可以写一个小函数来为你做比较并返回值,如果比较返回true,否则返回0以避免执行if块:

      int greater_than(int right, int left)
      {
         return left > right ? left : 0;
      }
      

      然后将其用作:

      if ( int value = greater_than(100, get_value()))
      {
            //wow!
      }
      

      或者您可以使用for 作为其他答案所说的。或者手动放大括号,缩小变量的范围。

      无论如何,我不会在生产代码中编写这样的代码。

      不要为机器编写代码。为人类编写代码。只要你遵循它们的语法,机器就会理解任何东西;人类了解他们可以阅读的内容。因此,与不必要的范围界定相比,您应该优先考虑可读性。

      【讨论】:

        【解决方案7】:

        在这种特殊情况下,您可以避免:

        if (int value = (get_value() > 100 ? get_value() : 0)) {
            ...
        }
        

        不过,我真的不推荐它。它不适用于您可能想要执行的所有可能的测试,它会调用get_value() 两次。

        【讨论】:

        • 为什么不if(get_value() &gt; 100) { int value = get_value(); ....}
        • @Nawaz:因为提问者提出了人为的限制(即没有充分的理由——我不会用真实的代码写这个,你的建议更好)。事实上,如果对get_value() 的调用次数无关紧要,那么我可能根本不会将它分配给变量,只需在循环体中输入get_value(),不管它需要多少次 :-)
        • @SteveJessop:没有充分的理由?限制变量的范围不是“没有充分的理由”:)
        • @DrTwox:当然,但是如果没有提到,添加额外的块是我会给出的“真实”答案,或者如果两次调用get_value() 是可以的,那么 Nawaz 所说的在没有else 子句的情况下,上面的评论中的这一点更胜一筹。实际上,无论如何,纳瓦兹的回答是对此的潜在改进。我会稍微修改一下,我不喜欢第一个参数称为right,第二个参数称为left的函数的想法!
        猜你喜欢
        • 2014-04-12
        • 2014-08-26
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        • 2021-12-27
        • 2021-03-04
        相关资源
        最近更新 更多