【问题标题】:C++17 if statement with initializer but no conditionC ++ 17 if 语句带有初始化器但没有条件
【发布时间】:2019-12-06 22:33:15
【问题描述】:

在 c++17 中,您可以执行以下操作:

if ( init-statement(optional); condition )

根据https://en.cppreference.com/w/cpp/language/if

但是我的编译器 (vs2019) 允许

if ( init-statement )

init 语句也是条件。我找不到这在任何地方都有记录,这真的可以保证工作吗?

【问题讨论】:

  • 怎么init-statement也是条件?什么意思?
  • 在您提供的 cppreference 链接中,condition 被允许“使用大括号或等号初始化程序声明单个非数组变量。”,这就是这里发生的情况。这是一个早于 C++17 的 C++ 特性。
  • 给出一个编译器允许的代码的真实示例会改善问题
  • 你真的应该举一个例子 (MVCE) 你用真实的代码尝试过什么。否则,我们不确定您对 init-statement 的解释,因此这是一个糟糕的问题)

标签: c++ if-statement c++17


【解决方案1】:

在 C++ 中,很多东西可以进入condition,而你不希望在那里被允许。例如,condition 可以是 int i = 20int i = 20 解析为可以根据上下文转换为布尔值并进行测试的值。

所以并不是你的编译器允许init-statement 没有condition。就是 C++ 从一开始就允许condition 语法包括声明一个变量,而你的代码只是在使用它。

【讨论】:

  • "语法 子集" 似乎不精确。例如。 init-statement 可以是 int x,y;condition 不能。
  • 我不认为int i=20 是一个表达式,它不是——也许你的意思是简单地说“那不是一个表达式”?
  • 那么int i = 20 not-an-expression 解析为哪个值?是i,因此是i!=0->false
【解决方案2】:

if 声明:

  • 评估condition的输出
  • 如果condition 的返回值为true(上下文可转换为布尔值)- 它执行 { ... }
  • 如果condition 的返回值为false - 它会跳过{ ... }

所以在你的情况下,if 只是执行 init-statement ,它的返回值不是 false 所以它执行你的其余代码({ ... })。

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 2019-05-30
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2019-04-12
    • 2016-06-20
    • 2022-11-05
    • 1970-01-01
    相关资源
    最近更新 更多