C ++ 03 стандарт определяет оператор выбора как:
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 дополнительно добавляет следующее правило:
condition:
type-specifier-seq attribute-specifieropt declarator braced-init-list
Обычно это означает, что объявление, которое вы можете поместить в условие, на самом деле является не чем иным, как сохранением значения выражения условия, названного для дальнейшего использования, т.е. для следующего кода:
if (int x = 3 && true && 12 > 11) {
// x == 1 here...
x
оценивается как: 3 && true && (12 > 11)
.
Вернуться к вашим вопросам:
3) C ++ 11 теперь позволяет использовать прямую инициализацию (с инициализатором скобок) в таких случаях, например:
if (int x { 3 && true && 12 > 11 }) {
4) Следующее: if ((int x = 1) && true)
не имеет смысла в соответствии с приведенным выше определением, поскольку оно не соответствует правилу: "выражение или объявление" для condition
.