|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.03.2012, 17:03 | #1 |
Форумчанин
Регистрация: 01.11.2011
Сообщений: 172
|
Не пойму оператор ","(запятая)
Вчера задавал подобный вопрос, хотел сегодня перечитать, но тему удалили.
У меня такой вопрос: почему при таком выражении int x=(1,010); cout<< x;// результат 8 а при таком int x=1,010; cout<< x;// результат 1 Мне вчера сказали, что х присваевается 010, потому что оператор "," работает слева направо, не до конца понимаю почему х присвается не 1, а 010. Заранее благодарен. Модераторам: просьба не удалять тему сразу, а пусть поживет пару дней
Желание тысяча возможностей, нежелание - тысяча причин
|
01.03.2012, 17:05 | #2 |
Форумчанин
Регистрация: 01.11.2011
Сообщений: 172
|
Извиняюсь перед модераторами, нашел вчерашнюю тему
Желание тысяча возможностей, нежелание - тысяча причин
|
01.03.2012, 17:28 | #3 |
Форумчанин
Регистрация: 01.11.2011
Сообщений: 172
|
Как посоветовали модераторы я почитал книгу, но там написано, что этот оператор всегда берет правое значение, а почему не объясняют, может надо принять как есть?
Желание тысяча возможностей, нежелание - тысяча причин
|
01.03.2012, 19:24 | #4 | |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
Цитата:
Форматируйте код, будьте людьми.
|
|
01.03.2012, 20:34 | #5 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
А есть правило, которому подчиняется оператор запятая. Другой вопрос, зачем вообще нужен вот именно такой оператор, с вот именно таким поведением. То бишь, где это может быть востребовано? Иногда бывают ситуации, когда результат вычисления выражения зависит от каких то предварительных действий. При этом, совершить эти действия требуется в контексте самого выражения. И разбивать контекст на "предварительные действия" и "само действие" либо невозможно, либо очень не удобно. Привожу простой пример ситуации, где оператор запятая оказался очень кстати: Предположим, тебе в твоих программах частенько требуется генератор случайных чисел, который возвращал бы тебе случайное число из диапазона от least до greatest включительно. Обыкновенно для этих целей используют стандартный ГСЧ. Для этого, сначала инициализируют его: Код:
Что не красиво, потому что каждый раз приходится рассчитывать формулу диапазона заново. Либо используют формулу, типа: Код:
Код:
В этом случае, можно пойти на хитрость, написав вот так: Код:
Причем, инициализируется переменная результатом, который вернёт функция InitRand(), а эта функция, в свою очередь инициализирует сам гсч Таким образом, уже не нужно в ручную инициализировать ГСЧ, и контролировать, что бы инициализация была только один раз. Можно сразу пользоваться функцией random(), и наслаждаться плодами цивилизации. Последний раз редактировалось _Bers; 01.03.2012 в 21:04. |
|
01.03.2012, 20:34 | #6 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Однако! Для того, что бы организовать автоматическую анициализацию ГСЧ, нам пришлось завести отдельную функцию InitRand().
А для такой простой задачи отдельная функция совершенно не нужна. И не зачем засорять глобальное пространство имен. И ух тем более, в глобальном (общедоступном) месте не должна находится функция, ничайный вызов которой сломает всю идею безопасной автоматической инициализации. Что бы автоматика получилась безопасной, нужно запретить возможность доступа к ней снаружи функции, где она используется. Другими словами, функцию InitRand() нужно поместить вовнутрь функции random(). Внутри random() произойдёт однократная инициализация ГСЧ, и никто снаружи не будет иметь к этой автоматике доступа. Для одноразовых операций заводить отдельную функцию так же нет никакой нужды. И вот здесь, оператор запятая оказывается очень кстати: Код:
Вопрос: чем она инициализируется? Выражение, стоящее в скобочках выглядит так: Код:
А там находится: Код:
Собственно это и есть автоматическая инициализация ГСЧ. Но результатом всего выражения по правилу оператора запятая - то, что справа. А справа нолик. Таким образом, результат всего этого выражения - ноль. Поэтому, выражение: Код:
Код:
При этом, для реализации рандома, не пришлось заводить дополнительных глобальных функций. И никто снаружи не имеет доступа к механизму её автоматики. Осталось дело за малым: в многофайловом проекте в хэдэрах нельзя объявлять и определять функции. Нужно, что бы в хэдэрах были только прототипы, а в спп - реализации. Но ради одной малюсенькой функции заводить отдельную пару h/cpp откровенно лень. И хочется запихать и объявление, и реализацию целиком в какой нибудь хэдэр. Сделать это без конфликтов многократного переопределения можно с помощью свойства шаблонов (шаблоны позволяют пихать все в один хэдэр) Код:
Последний раз редактировалось _Bers; 01.03.2012 в 20:39. |
01.03.2012, 20:48 | #7 | |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Цитата:
Можно саму random объявить как static, ну чтоб без шаблонов. |
|
01.03.2012, 21:00 | #8 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Если сделать функцию (или переменную) статической, то каждая единица трансляции получит собственную уникальную копию сущности. То есть, если тебе нужно, что бы на весь проект была создана только одна версия функции - можно сделать её шаблонистой, либо определять реализацию в файле cpp Но если тебе вдруг зачем то понадобилось, что бы очередная единица трансляции порождала дополнительную копию абсолютно одной и той же функции - тогда делай статики. Однако! При этом нужно учитывать, что каждая копия статической функции породит свою копию статик переменной. И при этом каждая копия статичесой переменой выполнит свою одноразовую инициализацию. Таким образом, функция: Код:
Итого: вместо гарантированной однократной инициализации, получишь гарантировано многократную. Ты уверен, что это именно то, что тебе было нужно? |
|
01.03.2012, 21:10 | #9 | |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Цитата:
ps. Например генерирование уникального номера (типа rtti) для класса Последний раз редактировалось EUGY; 01.03.2012 в 21:16. |
|
01.03.2012, 21:15 | #10 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
А в каких случаях это может быть необходимым?
Конкретно: 1. В каких случаях может быть необходимо каждой ед. трансляции иметь уникальную копию глобальной переменой? 2 В каких случаях может быть необходимо каждой ед. трансляции иметь уникальную копию обычной функции? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как можно заменять "запятая" на "Enter" | Silent-cry | Microsoft Office Word | 4 | 26.01.2018 12:03 |
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. | воваава | Помощь студентам | 3 | 01.12.2011 12:50 |
Как обойти "преобразование типа из "string" в "float" невозможно" | lexluter1988 | Помощь студентам | 1 | 07.08.2010 12:23 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |