Объявление переменной в выражении 'if' - PullRequest
1 голос
/ 21 октября 2011

Это продолжение C ++, объявление переменной в выражении 'if'

if( int x = 3 && true && 12 > 11 )
    x = 1;

Правила (насколько я могу судить):

  1. может иметь только 1 переменную, объявленную для каждого выражения
  2. объявление переменной должно выполняться первым в выражении
  3. должно использовать синтаксис инициализации копирования не синтаксис прямой инициализации
  4. не может иметь круглые скобки вокруг объявления

1 и 2 имеют смысл в соответствии с этим ответом , но я не могуувидеть причину 3 и 4. Может кто-нибудь еще?

1 Ответ

1 голос
/ 21 октября 2011

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.

...