Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интересный способ инициализации 
:(
    Опции темы
Любитель
Дата 2.3.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92




 ! 
Любитель
Тему про быков и пр. закрываем!



--------------------
PM MAIL ICQ Skype   Вверх
mrbrooks
Дата 2.3.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



SABROG, без скобок мягкотелый ругаетсо. оно и ясно.

Добавлено через 3 минуты и 26 секунд
Борману тоже не нравится  smile 
PM MAIL   Вверх
mes
Дата 2.3.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SABROG @  2.3.2009,  12:40 Найти цитируемый пост)
А теперь тот же код, но без скобок. Что будет в tst  smile ?

a оно скомпилится ?!


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 2.3.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(mes @ 2.3.2009,  13:52)
Цитата(SABROG @  2.3.2009,  12:40 Найти цитируемый пост)
А теперь тот же код, но без скобок. Что будет в tst  smile ?

a оно скомпилится ?!

Нет, гнутый тоже плюётся. Странно, что такому детей тут учат http://users.msu.dubna.ru/~ovg/c++course/p1-3.html


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
zim22
Дата 2.3.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Пример из MSND
Код
// cpp_comma_operator.cpp
#include <stdio.h>
int main () {
   int i = 10, b = 20, c= 30;
   i = b, c;
   printf("%i\n", i);

   i = (b, c);
   printf("%i\n", i);
}


У меня есть подозрение, что это разные ситуации.
В первом случае
Код
unsigned int tst = 1, 2, 3, 4;

происходит инициализация переменной (copy-initialization), при которой подразумевается использование знака равенства.
инициализация же не является присвоением.
во втором же 
Код
 i = b, c;

 вызывается оператор присвоения.

Это сообщение отредактировал(а) zim22 - 2.3.2009, 14:19


--------------------
PM MAIL   Вверх
SABROG
Дата 2.3.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



А гнутый такое не хавает:

Код

    unsigned int a = 1, b = 2, c = 3;
    unsigned int tst = a, b, c;


Код

error: redeclaration of `unsigned int b'
error: `unsigned int b' previously declared here
error: redeclaration of `unsigned int c'
error: `unsigned int c' previously declared here


А такое хавает  smile 
Код

    unsigned int a = 1, b = 2, c = 3;
    a = a, b, c;


Это сообщение отредактировал(а) SABROG - 2.3.2009, 14:37


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 2.3.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SABROG @  2.3.2009,  12:54 Найти цитируемый пост)
Странно, что такому детей тут учат: http://users.msu.dubna.ru/~ovg/c++course/p1-3.html


Цитата(zim22 @  2.3.2009,  13:19 Найти цитируемый пост)
У меня есть подозрение, что это разные ситуации.

ага, разные и тут в статье правильно написано

а вот ниже, имхо, немножко вводят заблуждение :
Цитата

 Вот в таких случаях и пишут что-нибудь в таком духе:
f(( (i=1), (j=2), i*j ) ));
То, что вы видите - вызов функции с одним аргументом. В конечном итоге, в качестве аргумента функция получит i*j. И правила языка не нарушены, и несколько выражений стоит. Эта же строка показывает и второе полезное применение этого оператора - мы прямо в вызове функции присвоили новые значения переменным i и j, и только после этого сосчитали значение аргумента i*j; То есть, с помощью оператора запятая можно гарантировать, что обработаются все операнды, причем обработаются они последовательно - слева направо. 

не знаю как на Си, a на С++ подобный пример даст UB.

Это сообщение отредактировал(а) mes - 2.3.2009, 14:39


--------------------
PM MAIL WWW   Вверх
vinter
Дата 2.3.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(mes @  2.3.2009,  15:35 Найти цитируемый пост)
a на С++ подобный пример даст UB.

с чего бы?

Цитата(SABROG @  2.3.2009,  15:33 Найти цитируемый пост)
А гнутый такое не хавает:

а должен, может я знаю что я делаю и мне надо именно так.
Цитата(mes @  2.3.2009,  14:52 Найти цитируемый пост)
a оно скомпилится ?!

а почему нет?


--------------------
Мой блог
PM MAIL WWW   Вверх
SABROG
Дата 2.3.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(vinter @  2.3.2009,  14:47 Найти цитируемый пост)
а должен, может я знаю что я делаю и мне надо именно так.

Наверное, все-таки не должен, т.к. возникает двойная трактовка. Приходится ему явно говорить мол "Вась, это не декларация"

В общем вот что получается:
Код

    unsigned tst1, tst2;
    tst1 = 1, 2, 3; // tst1 == 1
    tst2 = (1, 2, 3); // tst2 == 3


Это сообщение отредактировал(а) SABROG - 2.3.2009, 15:17


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 2.3.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vinter @  2.3.2009,  13:47 Найти цитируемый пост)

с чего бы?


vinter, это из той же оперы которую мы на днях обсуждали. В данном случае запятая есть разделитель аргументов, а не operator ,(); 
а в функции порядок вычисления аргументов стандартом не определяется и следовательно хотя бы одноразовое изменение и двойное употребление одной и той же переменной ведет к UB.



Цитата(vinter @  2.3.2009,  13:47 Найти цитируемый пост)

а почему нет? 

потому что в декларации ","  это тоже не operator,() ,  так же как "=" в декларации это не присваивание.

Это сообщение отредактировал(а) mes - 2.3.2009, 15:23


--------------------
PM MAIL WWW   Вверх
vinter
Дата 2.3.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(mes @  2.3.2009,  16:19 Найти цитируемый пост)
В данном случае запятая есть разделитель аргументов, а не operator ,(); 

это ты почему так решил? там скобки.

Цитата(mes @  2.3.2009,  16:19 Найти цитируемый пост)
потому что в декларации ","  это тоже не operator,()

ок


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 2.3.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vinter @  2.3.2009,  14:34 Найти цитируемый пост)
это ты почему так решил? там скобки.

ну и что толку от них ?! откуда  взять уверенность, что первым посчитается 1й параметр, а не 2й или 3й ?

Добавлено @ 16:01
вот запустил такой тестик на gcc
Код

#include <iostream>
#include <vector>
using namespace std;

void f (int a, int b, int c, int d)
{
    cout << a <<" " <<b << " "<<c<<" "<<d<<endl;
}
int main()
{
int i =2, j=3;
f((i=4),(i*j),(j=5),(j*i));

   system ("pause");
}

выдает: 4 10 5 6
чем и оправдывает "предположение" smile 
(расчет аргументов происходит в обратном порядке..)

Это сообщение отредактировал(а) mes - 2.3.2009, 16:03


--------------------
PM MAIL WWW   Вверх
vinter
Дата 2.3.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(mes @  2.3.2009,  16:56 Найти цитируемый пост)
ну и что толку от них ?! откуда  взять уверенность, что первым посчитается 1й параметр, а не 2й или 3й ?

там нет никаких 1,2,3,4 параметров. Там есть один большой параметр - скобка

Добавлено через 3 минуты и 28 секунд
mes, ты вообще не то сделал.
вот так вызывай
Код

f(((i=4),(i*j),(j=5),(j*i)));



--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 2.3.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(vinter @  2.3.2009,  15:03 Найти цитируемый пост)
там нет никаких 1,2,3,4 параметров. Там есть один большой параметр - скобка 

оооп. извиняюсь..то что там только один большой параметр я не досмотрел..  smile 


--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 2.3.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

(i=4)

это помоему локальное присвоение - аргумент по умолчанию.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0706 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.