Я натрапив на цю дивну програму на C ++.
#include <iostream>
using namespace std;
int main()
{
int a = ({int x; cin >> x; x;});
cout << a;
}
Хто-небудь може пояснити, що відбувається? Як називається ця конструкція?
Я натрапив на цю дивну програму на C ++.
#include <iostream>
using namespace std;
int main()
{
int a = ({int x; cin >> x; x;});
cout << a;
}
Хто-небудь може пояснити, що відбувається? Як називається ця конструкція?
Відповіді:
Він присвоює користувачеві введене значення a
та друкує його. це робиться за допомогою Statement Expression
.
Вирази виразів - розширення компілятора gnu gcc не підтримуються стандартами C / C ++. Отже, будь-який код, який використовує вираз оператора, нестандартно відповідає та не переноситься.
IBM IBM XL C / C ++ v7.0 також підтримує вирази висловлювань, і їх документація влучно пояснює їх:
Вирази заяви:
Складений вираз - це послідовність висловлювань, укладених фігурними дужками. У GNU C складений вираз усередині дужок може виглядати як вираз у тому, що називається a
Statement expression
.
.--------------.
V |
>>-(--{----statement--;-+--}--)--------------------------------><
Значення виразу оператора - це значення останнього простого виразу, що відображається у всій конструкції. Якщо останнє твердження не є виразом, тоді конструкція має тип void і не має значення.
Завжди скомпілювати код, вибравши sandard в GCC, використовуйте один з варіантів -ansi
, -std=c90
або -std=iso9899:1990
, -std=c++03
, -std=c++0x
; щоб отримати всю діагностику, яку вимагає стандарт, слід також вказати -pedantic
(або -pedantic-errors
якщо ви хочете, щоб це були помилки, а не попередження)
Це розширення GCC. Складіть свій код з -pedantic
прапором , якщо ви хочете , щоб позбутися від речей , як це (і ви дійсно дійсно хочете).
Він створює вбудований обсяг, оголошує x
всередині нього, зчитує його зі стандартного вводу, і весь висновок нарешті обчислюється на x
, якому присвоюється a
.
Оператор-кома працює аналогічно, хоча для цього не потрібна окрема область. Наприклад:
int x;
int a = (cin >> x, x);
зробив би те саме. Всі оператори, пов'язані з комами, будуть виконуватися послідовно, а результат усього виразу буде встановлений на значення самого правого операнда.
Я не вірю, що це стандартний C ++. Ймовірно, це розширення, специфічне для компілятора, яке дозволяє внутрішній обсяг оцінити значення.