C++03 standard defines selection statement as:
selection-statement:
if ( condition ) statement
if ( condition ) statement else statement
switch ( condituion ) statement
condition:
expression
type-specifier-seq attribute-specifieropt declarator = initializer-clause
C++11 additionally adds the following rule:
condition:
type-specifier-seq attribute-specifieropt declarator braced-init-list
Generally it means that the declaration you might put inside the condition is in fact nothing more than keeping the value of the condition expression named for further use, i.e. for the following code:
if (int x = 3 && true && 12 > 11) {
// x == 1 here...
x
is evaluated as: 3 && true && (12 > 11)
.
Back to your questions:
3) C++11 allows you now to use direct initialization (with brace initializer) in such case, e.g:
if (int x { 3 && true && 12 > 11 }) {
4) The following: if ((int x = 1) && true)
does not make sense according to the definition above as it does not fit the: "either expression or declaration" rule for the condition
.