C++双括号if语句是什么意思?

3

我发现了一个if语句,其中条件实际上是一种赋值方式,但我并不真正理解它的作用。现在,我找到了一个类似的问题,并得到了详细的答案,但我仍然不太明白我的代码片段具体做什么:

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?

4
在 if 条件语句中执行一个赋值操作时,许多编译器会发出警告,因为很可能本意是进行相等性检查,而打错了字。额外的括号告诉编译器:“这是有意进行的赋值操作,请不要对此发出警告。” - Eljay
1
你是在问关于C++(这是你的标签)还是shell脚本语言(这是你引用的内容)? - john
1
[C++] 这是一种尝试阻止编译器对 if 语句中常见(但合法)的赋值而非相等性测试的警告的方法。 - Richard Critten
1
不要期望任何给定的字符序列在所有语言中都有相同的含义。 - molbdnilo
1个回答

10
它和 if(x = !x) 的作用是一样的。但是,因为很容易在 if 语句中不小心使用 = 来代替 ==,所以编译器会在你使用赋值符号时发出警告。如果赋值表达式在一个第二组括号内部,则该警告不会显示。
因此,额外的括号的目的在于告诉编译器/读者,作者确实想使用赋值而不是相等测试。

4
“x = !x;”先执行,然后再执行“if(x)”会使代码风格更佳可读。但现在的写法仍然很糟糕。 - Jeffrey
1
@Jeffrey 人们很奇怪 ;) - Richard Critten
3
请注意,警告的产生和屏蔽都不是语言定义的一部分。这是编译器的事情,而不是语言的事情。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接