声明作为条件 - 添加括号会导致错误

sje*_*397 2 c++ variable-assignment conditional-statements

为什么这样可以:

\n\n
if(int i = 1) {\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

...而以下会产生错误?

\n\n
if((int i = 1)) {\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 g++ (4.4.5) 下,后者给出:

\n\n
\n

test.cpp:7: 错误: 预期的主表达式在 \xe2\x80\x98int\xe2\x80\x99
\n test.cpp:7: 错误: 预期的 \xe2\x80\x98)\xe2\x80\x99 之前\xe2\x80\x98int\xe2\x80\x99
\n test.cpp:9: 错误: 预期 \xe2\x80\x98)\xe2\x80\x99 在 \xe2\x80\x98else\xe2\x80\x99 \
之前n test.cpp:13: 错误:\xe2\x80\x98}\xe2\x80\x99 标记之前预期的主表达式
\n test.cpp:13: 错误:预期 \xe2\x80\x98;\xe2\x80 \x99 位于 \xe2\x80\x98}\xe2\x80\x99 标记之前

\n
\n\n

顺便说一句,我问的原因是因为这个答案:Seeing what class an object is

\n\n

我正在尝试找到一种方法使条件更具可读性。通常,我更喜欢,例如:

\n\n
if((x = y) != 0) {\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
if(x = y) {\n
Run Code Online (Sandbox Code Playgroud)\n\n

...因为它更具可读性并且使编译器“注释”静音,表明我可能使用了错误的运算符。如果我使用声明作为条件,它不会产生警告,但可读性似乎仍然受到影响。

\n

Aby*_*byx 5

这是因为 C++ 标准 6.4 p1。

选择语句选择多个控制流之一。

选择声明:

if ( condition ) statement
if ( condition ) statement else statement
switch ( condition ) statement
Run Code Online (Sandbox Code Playgroud)

健康)状况:

expression
type-specifier-seq declarator = assignment-expression
Run Code Online (Sandbox Code Playgroud)