【问题标题】:Why does C++ offer declarations in if statements?为什么 C++ 在 if 语句中提供声明?
【发布时间】:2021-10-22 20:58:27
【问题描述】:

我最近了解到if statements 可用于在 C++ 中声明变量。我个人并不真正了解其背后的原因。

if statements 不应该只检查条件是否正确,并且声明变量会导致错误吗?

也就是说,据我所知,if statements 只能比较两个单独的值。所以在if statement 中声明任何东西真的没有意义,因为你没有比较任何东西。

原帖:

为什么 c++ 编译器会接受这个:

#include <iostream>

int Test()
{
    return 10;
}

int main()
{
    if (int n = Test())
    {
        std::cout << "hi";
    }
}

更具体地说:为什么 if (int n = Test()) 是一个有效的语句?

【问题讨论】:

  • 我可以补充一点吗?
  • 本地声明 n 到仅包含 if 逻辑块的生命周期。
  • 把它想象成if ((n = test()) != 0)
  • 你在这里真的问了两个问题: 1. 为什么你可以这样定义和初始化一个变量?和 2. 假设你可以,为什么有这种说法有意义。你得到的只是这两个问题之一的一些答案。仅供参考。
  • 考虑if (n = test()) { cout &lt;&lt; "hi, I'm the result of test() " &lt;&lt; n; }n 只在块的生命周期内存在,你不需要调用 test() 两次。

标签: c++ function if-statement syntax


【解决方案1】:

谁会使用int n = Test() 作为 if 语句?

限制了n 的范围,在if 语句中,谁想要它就这样做。


现在如果你问:

“为什么你可以声明、初始化和使用这样的变量?”

这是有效的,因为 C++ 标准是这样说的。 if-statement,语法

attr(optional) if (condition) statement-true else statement-false

....
条件

【讨论】:

  • 不要真正得到“使用大括号或等号初始化程序声明单个非数组变量。”
  • @TheDogeMaster,大括号:int n{5},等于:int n = 5。值得注意的是,您不能像在其他地方那样使用括号。
  • 不确定 chris 在说什么,因为我知道等号和 {} 是什么意思
  • @TheDogeMaster,那我搞错了,你没看懂哪一部分。
  • 我已经掌握了 c++ 的基础知识(几乎所有常用的东西)
【解决方案2】:

这基本上是一种简写方式:

{
    int n = Test();
    if (n != 0)
    {
        std::cout << "hi";
    }
}

所以,如果Test() 返回了0,那么我们就不会进入if 块,否则我们会这样做并且我们将让n 立即读取它返回的内容,仅在那个if的范围。

请注意,这种情况下的整数值可以被视为布尔值,其中0 == false 和其他任何值都是true

【讨论】:

  • 对不起,如果我是个白痴,但是如何将 n 用作布尔值?它不返回真或假。
  • 整数可以作为布尔值计算。 0是假的,其他都是真的。事实上,bool 类型本质上是 0 和 1 的宏。不清楚您的理解问题是代码的 assignment / initialization 方面还是布尔值中使用的整数语境。你能澄清一下到底是什么令人困惑吗?
  • 但是为什么你能做到这一点?为什么不能写if ((int n = Test()) != (int y = 2)) { do_stuff(); }
  • @einpoklum 也没想到
  • @einpoklum 我根据我对 OP 对 C++ 经验水平的判断写了一个答案。我不认为 OP 正在寻找/需要对包含标准纸质行话的解释,就像您在对其他答案的评论中所做的那样。我认为这太技术性了。
【解决方案3】:

init 语句的原因是为了限制变量的范围,允许函数返回值的重用。 C++17 为 iffor-each 引入了专用的 init 语句 有时您可能想在使用它返回的值之前通过返回 0 或 nullptr 来检查函数是否失败,并且您不想污染范围。

void foo()
{
   if(int var = some_function(); var != 0)
   {
      // use var
      use_var(var);
   }
   else throw std::exception();
}

它在if 语句中可能并不常见,但在for-each 语句中更方便。看看这个例子。

struct test
{
   std::vector<int> elements;
   auto& items()
   {
      return elements;
   }
}

test get_test()
{
   return {};
}

void foo()
{
   // for(auto e : get_test().items()) - this would cause a new test struct element to be created per each iteration and would invalidate the iterator.
   
   for(auto obj = get_test(); auto e : obj) // test created only once, no iterator invalidation
   {
      std::cout << e << '\n';
   }
}

【讨论】:

    【解决方案4】:

    您在if 语句中放入的条件表达式是一个操作。 如果操作成功(意思是n被声明并填充10),那么它的值为true。所以它会编译并运行if 语句。

    【讨论】:

    • 我不记得 '=' 运算符返回 true 或 false。
    • @TheDogeMaster:它们返回对赋值左侧的左值引用。这通常可以被评估为一个整数值。
    • @TheDogeMaster • 在 C++ 中,零值是falsy,非零值是truthy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多