Comma Operator и назначение

-6

Рассмотрим утверждение:

int a;
a = 1,2,3;
cout<<a; // prints a = 1

Я консультировался с этим сайтом. Теперь это происходит потому, что оператор с comma имеет наименьший приоритет. Так что это как (a=1),2,3. Но из любопытства я хочу знать, что происходит после этого, компилятор забывает о остальных цифрах 2 и 3. Потому что я думаю, если они считаются то, возможно, первые 1, а затем 2, а затем 3 будет инициализируются (аналогично a a = (1,2,3)). Скажите, пожалуйста, что здесь происходит?

спросил(а) 2017-10-10T18:08:00+03:00 2 года, 5 месяцев назад
0
107

Это:

a = 1,2,3;

эквивалентно:

a = 1;
2;
3;

Таким образом, 2 и 3 будут оцениваться, но не имеют никакого эффекта.

Вы можете скомпилировать с g++ main.cpp -Wall -Wextra и позволить компилятору предупредить вас:

warning: right operand of comma operator has no effect [-Wunused-value]
a = 1,2,3;
^
warning: right operand of comma operator has no effect [-Wunused-value]
a = 1,2,3;
^

ответил(а) 2017-10-10T18:15:00+03:00 2 года, 5 месяцев назад
72

a = 1,2,3 - выражение, равное 3, с побочным эффектом присвоения 1 a.

То есть, вы могли бы написать

int b = (a = 1, 2, 3);

и b будет иметь значение 3, и a 1.

Оценка 2 никогда не имеет эффекта. У вас есть предупреждения о компиляторе?

ответил(а) 2017-10-10T18:24:00+03:00 2 года, 5 месяцев назад
36

Когда вы это сделаете

#include<iostream>
int main()
{
int a;
a=1,2,3;
}

Полный журнал компилятора. Компилятор просто сделает

     mov dword ptr [rbp - 4], 1 

будет игнорировать 2 и 3 и предупреждение, как упоминалось gsamaras

ответил(а) 2017-10-10T18:26:00+03:00 2 года, 5 месяцев назад
36

Из стандарта C (6.5.17 Comma)

2 Левый операнд оператора запятой оценивается как выражение в виде пустоты; между его оценкой и точкой правильного операнда есть точка последовательности. Затем оценивается правый операнд; результат имеет свой тип и значение

Таким образом, в общем случае это выражение

a = 1,2,3;

похоже

( a = 1 ), ( 2 ), ( 3 );

(точнее, как ( ( a = 1), ( 2 )), ( 3 ) то есть выражение содержит два оператора запятой)

Поскольку результаты оценки выражений ( 2 ) и ( 3 ) не используются, компилятор может удалить их из сгенерированного объектного кода. Только выражение ( a = 1) имеет побочный эффект изменения переменной a.

Поэтому компилятор может рассматривать это утверждение так же, как

a = 1;

С другой стороны, если рассматривать декларацию

int a = ( 1,2,3 );

то здесь инициализатор представляет собой выражение с (двумя) запятыми. Таким образом, декларация эквивалентна

int a = ( ( 1 ), ( 2 ), ( 3 ) );

Поскольку выражения ( 1 ) и ( 2 ) оцениваются как выражения void и не имеют побочных эффектов, компилятор может удалить их из сгенерированного объектного кода и рассмотреть объявление типа

int a = 3;

ответил(а) 2017-10-10T18:23:00+03:00 2 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема