【问题标题】:What does C++ if-Statement with double parantheses do?带有双括号的 C++ if 语句有什么作用?
【发布时间】:2021-02-01 14:32:30
【问题描述】:

我偶然发现了一个if 语句,其中条件实际上是一个赋值,我并不真正理解它的作用。现在,我发现了一个类似的问题,答案很广泛,但我还是不太明白,我的 sn-p 做了什么:

if ((x = !x))
    /* some code */

我发现的类似问题是这个:https://unix.stackexchange.com/questions/306111/what-is-the-difference-between-the-bash-operators-vs-vs-vs

一位用户表示,

((...)) 双括号围绕算术指令,即整数计算,其语法类似于其他编程语言。这种语法主要用于赋值和条件。这仅存在于 ksh/bash/zsh 中,不存在于普通 sh 中。

这是什么意思? x 的值现在是否已切换并且没有发生其他任何事情?这个条件在什么情况下返回false

【问题讨论】:

  • 在 if 谓词中执行 assignment 时,许多编译器会发出 warning,因为预期的可能是 等式检查,并输入了一个错字。额外的括号告诉编译器“故意做一个赋值,不要警告我。”
  • 您是在询问 C++(这是您的标签)还是 shell 脚本语言(这是您的引号所涉及的)
  • [C++] 这是试图阻止编译器警告一个常见的(但合法的)错误,即在 if 语句中分配而不是测试相等性。
  • 不要期望任何给定的字符序列在所有语言中都具有相同的含义。

标签: c++ unix


【解决方案1】:

它的作用与if(x = !x) 相同。然而,因为很容易意外地使用= 代替==,所以当您在if 语句中使用赋值时,编译器会警告您。如果赋值表达式在 second 括号内,则不会显示该警告。

这就是额外括号的意义:告诉编译器/阅读器作者真的打算使用赋值而不是相等测试。

【讨论】:

  • 它的风格仍然很糟糕。首先x = !x;,然后if (x) 更具可读性。
  • @Jeffrey 人们很奇怪 ;)
  • 请注意,警告及其抑制都不是语言定义的一部分。这是编译器的事情,而不是语言的事情。
猜你喜欢
  • 2011-04-08
  • 2023-01-16
  • 2017-02-06
  • 2012-05-01
  • 2013-02-23
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
相关资源
最近更新 更多