Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Объясните плиз как это называется


Автор: Vingrad 1.4.2007, 18:33
Добрый вечер, есть фрагмент кода, объясните пожалуйста, как объяснить получаемый результат, и как называется подобный синтаксис код
Код

int var, var1, var2;
var = (var=10, var2=11, var1+1);
cout<<var;

что будет храниться в var, те кто может объяснить думаю должны знать.

Спасибо.

Автор: likehood 1.4.2007, 18:48
Впервые вижу такой код, но, как ни странно, он компилируется.
Судя по выводу программы, переменной var будет присвоен результат последнего из перечилсенных в скобках через запятую выражений. В данном случае это будет значение переменной var1 + 1 (кстати, var1 надо сначала инициализировать). Как это называется по-науке я не знаю, да и непонятно где может понадобиться такой код.

Добавлено через 1 минуту и 38 секунд
Кстати, ник зачётный.  smile 

Автор: Fazil6 1.4.2007, 19:24
запятая обеспечивает порядок вычисления выражений слева направо. В данном выражении var будет присвоен результат выражения var1+1

Автор: Vingrad 1.4.2007, 19:29
Да видимо вы правы. Спасибо.  smile 

Автор: Earnest 2.4.2007, 12:46
оператор "запятая" это называется.
Fazil6 точно прав.  smile  

Автор: VFaraon 2.4.2007, 16:51
А вот что пишет Страуструп:

Цитата

Порядок вычисления:
 
Порядок вычисления подвыражений в выражении не определен. Например 

int i = 1;
v[i] = i++;

может вычисляться или как v[1]=1, или как v[2]=1. При отсутствии ограничений на порядок вычисления выражения может генерироваться более хороший код. Было бы замечательно, если бы компилятор предупреждал о подобных неоднозначностях, но большинство компиляторов этого не делают. 

Относительно операций 

,    &&    ||

гарантируется, что их левый операнд вычисляется раньше, чем правый. Например, b=(a=2,a=1) присвоит b 3. Заметьте, что операция последования , (запятая) логически отличается от запятой, которая используется для разделения параметров в вызове функции. Рассмотрим 

f1(v[i],i++);       // два параметра
f2( (v[i],i++) )    // один параметр

В вызове f1 два параметра, v[i] и i++, и порядок вычисления выражений-параметров не определен. Зависимость выражения-параметра от порядка вычисления - это очень плохой стиль, а также непереносимо. В вызове f2 один параметр, выражение с запятой, которое эквивалентно i++. 

С помощью скобок нельзя задать порядок вычисления. Например, a*(b/c) может вычисляться и как (a*b)/c, поскольку * и / имеют одинаковый приоритет. В тех случаях, когда важен порядок вычисления, можно вводить дополнительную переменную, например, (t=b/c,a*t). 

Увеличение и уменьшение:

Операция ++ используется для явного выражения приращения вместо его неявного выражения с помощью комбинации сложения и присваивания. По определению ++lvalue означает lvalue+=1, что в свою очередь означает lvalue=lvalue+1 при условии, что lvalue не вызывает никаких побочных эффектов. Выражение, обозначающее (денотирующее) объект, который должен быть увеличен, вычисляется один раз (только). Аналогично, уменьшение выражается операцией --. Операции ++ и -- могут применяться и как префиксные, и как постфиксные. Значением ++x является новое (то есть увеличенное) значение x. Например, y=++x эквивалентно y=(x+=1). Значение x++, напротив, есть старое значение x. Например, y=x++ эквивалентно y=(t=x,x+=1,t), где t - переменная того же типа, что и x. 

...................................

и т. д. smile


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)