这对额外的括号有什么作用?

What does this extra pair of parentheses do?

在查看一段代码时,我看到了这一行:

if ((b = a)) { /* statements */ }

看了上下文,我知道它的用意是这样的:

b = a;
if (b != 0) { /* statements */ }

我知道上面两行可以简化成第一个代码块,但是为什么是两对括号呢?这不会显得多余吗?我认为这完全可以:

if (b = a) { /* statements */ }

通常这样做是为了避免来自编译器的警告,即分配将(然后)作为条件进行评估(以防开发人员在 == 中错过 =

warning: suggest parentheses around assignment used as truth value

更具指示性的东西,

int c = !!(b = a); // condition

if (!!(b = a)) {