Составное выражение в операторе if - PullRequest
0 голосов
/ 15 мая 2018

Я наткнулся на возможность сделать это.

#include <iostream>
using namespace std;

int main() {
    if ( ({int i = 1024; i == 10;}) ) {
        cout << "In" << endl;
    }
}

Важной областью разборки, кажется, является:

->  0x10000118f <+15>: movl   $0x400, -0x18(%rbp)       ; imm = 0x400 
    0x100001196 <+22>: cmpl   $0xa, -0x18(%rbp)
    0x10000119a <+26>: sete   %al
    0x10000119d <+29>: andb   $0x1, %al
    0x10000119f <+31>: movb   %al, -0x19(%rbp)
    0x1000011a2 <+34>: testb  $0x1, -0x19(%rbp)
    0x1000011a6 <+38>: je     0x1000011d9               ; <+89> at main.cpp:37

Из рассмотрения этого кажется, что требуется последнийоператор (сравнение i == 10) в качестве логического значения для оператора if.

Я понимаю, что этот случай не позволяет мне использовать переменную i в операторе if из-за оператора области действия,но хотел знать , почему оператор if решает использовать i == 10 в качестве логического оператора.

В качестве альтернативы этому я понимаю, что вызов функции может быть чище, который возвращаетлогическое значение, которое я могу использовать для установки переменной для оператора if.Однако я вижу MACRO, которые расширяются до этого очень похожего стиля в исходном коде glibc.

Это старый стиль программирования с MACRO?

Есть липольза от этого мне не хватает?

1 Ответ

0 голосов
/ 15 мая 2018

Расширение GCC для языка C ++ позволяет использовать в качестве выражения составной оператор в скобках (то есть операторы, разделенные точкой с запятой, внутри фигурных скобок, внутри круглых скобок). Для оценки выражения операторы выполняются по порядку, а значение выражения в последнем выражении используется в качестве значения выражения в целом.

Это в первую очередь полезно для функционально-подобных макросов, которым нужно объявлять свои собственные локальные переменные. Поскольку он специфичен для GCC, его лучше избегать, если это не является абсолютно необходимым & mdash; а в случае C ++ лучше избегать использования функционально-подобных макросов в пользу шаблонных функций.

Так что это хорошая вещь, о которой нужно знать, но это не очень хорошая вещь для использования в C ++, даже на компиляторе, который ее поддерживает.

РЕДАКТИРОВАТЬ: Как отметил Jodocus, в C ++ 17 доступна аналогичная функция, благодаря которой инициализатор в стиле цикла может предшествовать условию в операторе if (как это делается в операторе for). Лично я считаю, что это ненужное усложнение, поскольку оно имеет примерно такой же эффект, как простое помещение инициализатора и оператора if в фигурные скобки, но в размещенном вами коде это технически будет допустимым вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...