![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
У Сыроежки есть квест, а у всех остальных - нет. Стало как-то обидно и я решил устранить это досадное недоразумение.
1. есть ли какие-то принципиальные различия между тернарным оператором и оператором if, если есть, то какие. другими словами можно ли написать что либо тернарным оператором, что нельзя написать простым if-ом 2. что будет выведено и почему?
3. что делает этот код?
4. что выведет код и почему?
5. есть ли разница между переменными x1, x2 и x3, x4. Если есть, то какая?
6. Какой конструктор копирования генерирует компилятор для класса при необходимости, с константной ссылкой или нет? пока это ![]() Это сообщение отредактировал(а) azesmcar - 9.7.2011, 14:20 |
||||||||
|
|||||||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
квест по Си, пожалуйста, в студию..
-------------------- undefined |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Здесь все просто . Если я правильно разглядел, то ч присваивается результат оператора "запятая", то есть последнее выражение, которое соответсвует вызову функции foo. Функция возвращает ++y, то есть значение равное 1. Поэтому и x. и y будут равны 1. Я это написал без всякой проверки с помощью компилятора. Было бы интереснее, если бы вы написали x = (y = 10, foo() ); А в самой функции не return ++y; а return y++; Это сообщение отредактировал(а) Сыроежка - 9.7.2011, 20:35 |
|||
|
||||
Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: нет Всего: 50 |
Сыроежка,
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
У оператора запятая, приоритет ниже чем у оператора присваивания. Знатоку тонкостей автоматического приведения типов, как-то не к лицу путаться с приоритетами. Но хоть, по крайней мере, честно |
|||
|
||||
voral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 16.3.2008 Где: Иваново Репутация: нет Всего: нет |
Мда.... 4ый не допетрил почему поучилось то, что получилось
![]() |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
voral, Здесь идет вызов foo(2); так как (1, 2) заключен в скобки, это всё - первый аргумент. Единица просто теряется, остается 2 Это сообщение отредактировал(а) volatile - 10.7.2011, 00:10 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
не хочу торопить события... но сыроежко пустозвон? как мальчик колокольчик? я именно так и понял его ответы)
|
|||
|
||||
voral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 16.3.2008 Где: Иваново Репутация: нет Всего: нет |
||||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
У присваивания приоритет выше выполняется так i = 1; 2; Здесь можно задать вопрос почему в программе можно писать 2; и это не будет ошибкой. Можете попробовать. Корректная (хотя и абсолютно бесполезная) программа:
http://liveworkspace.org/code/5b387bc649b1...a41564ee35503fa ![]() |
|||
|
||||
voral |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 16.3.2008 Где: Иваново Репутация: нет Всего: нет |
Я это знаю. И понимаю, почему выбрано именно 1. И сам же сказал, что будет 1. Меня больше интересует вопрос почему
здесь будет равно 2. Пробовал подставлять функции - отрабатывают обе. Правильно ли я понимаю, что здесь, упрощенно, раскладывается на две операции: i=1; i=2; соответственно первая в компилированный код не идет за ненадобностью. (Если функция то она вызывается) Поэкспериментировал с gdb
|
||||
|
|||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
||||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Потому-что скобки. (Разве не очевидно?) ![]() Сначала, вычисляется выражение в скобках temp = 1; temp = 2; и потом присваивается переменной i = temp; Ну где-то так.. Смотреть на асме - естественно бесполезно. Любой мало-мальский оптимизатор зарубит это на корню. Добавлено через 1 минуту и 29 секунд Упс, пока я тут заваривал кофе asmdzen, уже ответил. Сорри. |
|||
|
||||
asmdzen |
|
||||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
volatile, lock(thread) забыл
![]()
параметры функции? типа:
Это сообщение отредактировал(а) asmdzen - 10.7.2011, 12:46 |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
это можно написать с помощью if, код будет выглядеть иначе, но можно. Добавлено через 1 минуту и 3 секунды
так работает оператор запятая. не совсем понятно в чем вопрос. |
|||
|
||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
инициализацию (присвоение) ссылки
Добавлено @ 13:19 x1 и то, на что указывает x3 - не инициализированы, а x2 и то, на что указывает x4 - инициализированы значениями по-умолчанию. Для int - нули P.S. а зачем #include <iostream> ? ![]() Добавлено @ 13:22
Думаю, не имеет значения, т.к. компилятор по этой ссылке всё равно ничего не пишет, а на этапе исполнения const'ов вообще нет. Предполагаю, что константная, но как это проверить - не имею ни малейшего понятия. Это сообщение отредактировал(а) borisbn - 10.7.2011, 13:24 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
верно, еще есть? Добавлено через 1 минуту и 42 секунды да, верно. а iostream от предыдущего примера остался ![]() Добавлено через 6 минут и 50 секунд компилятор не пишет, но пользователь вызывает конструктор, сгенерированный компилятором и констатность здесь играет роль. Добавлено через 8 минут и 7 секунд borisbn вышлю ответ в приват. |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Я смотрел код поверхностно. Даже с трудом разглядел, что там запятая, так как у меня заканчивалось время, выделенное на интернет в интернет-кафе. А когда суетишься, что бы успеть напечатать, то уже не вникаешь. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Раздел вроде для новичков, а отвечают профессионалы. Ну раз так, то и я тогда отвечу:
1. отличие кардинальное - тернарный оператор можно использовать в константных выражениях. Например, для метапрограммирования (программы этапа компиляции, "Современное программирование на С++", А. Александреску) и условной инициализации констант (в т.ч. и ссылок). 3. массив будет заполнен "словами" (точнее, непробельными символами, которые изначально разделены пробельными) из потока. 6. генерируется конструктор, которому передается ссылка на константный объект |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
при неконстантом конструкторе копий этот код по стандарту не скомпилирутся.. (некоторые версии студии скомпилируют из за своего несоответсвия стандарту ) Это сообщение отредактировал(а) mes - 10.7.2011, 18:25 |
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
bsa, и Вы и azesmcar в личке говорите о
Можете пояснить, каким образом тернарный оператор незаменим в метапрограммировании ? Что вообще имеется в виду ? Спасибо. Кого имели в виду ? Лучше ответить в личку, если не против Добавлено через 1 минуту и 32 секунды mes, ну я так понимаю, что при разкомментированном
? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
при раскомментированом компилиться не должен.. на этом принципе основана "защита" от копирования auto_ptr (в vector).. Это сообщение отредактировал(а) mes - 10.7.2011, 18:55 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
azesmcar, mes, спасибо. По поводу вопроса
всё стало понятно - и вопрос и ответ ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
mes, Почему этот код не скомпилится. По крайней мере здесь компилится. http://liveworkspace.org/code/ea840a0b6f28...2cddb89f87265fe На студии тоже скорей всего скомпилится. ??? Или вы имелли ввиду не скомпилится при расскоментировании? Это сообщение отредактировал(а) volatile - 10.7.2011, 20:10 |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Есть у меня дурацкое свойство - не понимаю общие понятия, люблю разбираться на примерах... поэтому не понял... :( Что именно имеется в виду ? Можно пример на Си++ ? Спасибо. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
точно так же как и при раскомментировании.. при константном конструкторе копий все будет компилиться, что и доказывает, что компилятор по умолчанию генерирует константный конструктор копий... Добавлено через 3 минуты и 6 секунд если б генерировался (только) неконстантный, то нескомпилировался (если конечно других нарушений стандарта в этом русле у компилятора нет ) |
||||
|
|||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
вобщем помойму лучше сразу поянить, чтоб не вызывать кучу дополнительных вопросов..
по стандарту при пристыковке rvalue (условно говоря временного объекта) к константной ссылке, время жизни объекта увеличивается на время жизни ссылки.. С неконстантной ссылкой попытка подобного присвоения вызовет ошибку.. поэтому возможно так
но нельзя тоже самое с неконстантной :
в студии (помойму 2008) пошли "на встречу" пользователю и убрали несправедливость по отношению к обычной ссылке, позволяя к ней пристыковывать rvalue.. поэтому на ней вторая часть кода компилится "нормально" , что не позволяет проверить какой конструктор копий она генерит по умолчанию.. А также этим создает целый ряд неожидаемых и трудноуловиммых ошибок.. |
||||
|
|||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
![]()
это объявление прототипа функции.
не всегда, бывают варианты. Если один из членов класса имеет неконстантный аргумент конструктора копирования, то и сгенерированный будет неконстантным. Если попытаться самому написать этот конструктор вместо компилятора причины сразу станут очевидны.
http://liveworkspace.org/code/92ed0e2bdbf8...0dd43271d886de0 |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
azesmcar, спасибо, понял (про тернарный в константном выражении)
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
azesmcar |
|
||||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Ну в общем-то практически на все вопросы уже ответили, но все равно сгруппировать стоит.
Кому хочется еще подумать можете не читать ![]()
Тернарный оператор умеет работать на этапе компиляции и может быть использован в метапрограммировании. В этом и есть его принципиальное различие. Как верно заметили на первой странице, приоритет оператора присваивания выше приоритета оператора запятая. Потому здесь будет выведено 10:1 Это не вызов конструктора класса std::vector, это обявление прототипа функции по имени data, возвращающей std::vector<std::string> и принимающей два параметра типа std::istream_iterator<std::string> с именем формального параметра is и вторую, того же типа но без имени..скобки игнорируются. В C++ все, что может быть интерпретировано как объявление интерпретируется как объявление. Здесь все действительно просто. Вызывается оператор запятая, потому работает первая перегрузка.
В случаях x2 и x4 структура инициализируется нулями.
Здесь стоит рассказать побольше. В C++ копирующим конструктором является конструктор, принимающий аргументом константную, либо обычную ссылку (+ все комбинации const и volatile) на объект своего типа. Если копирующий конструктор не написан пользователем, но необходим, компилятор попытается сгенерировать его сам. Сгенерированный конструктор копирования для класса
будет иметь следующий вид
теперь заменим int x на какой нибудь класс X. В строчке x(aref.x) вызывается конструктор копирования для класса X, которому передается константная ссылка на объект класса X (константная, потому-что aref константа). В таком случае компилятор не сможет откомпилировать этот код и ему придется убрать константность аргумента копирующего конструктора класса A. Если вкратце, то константность аргумента копирующего конструктора решается компилятором в зависимости от константности аргументов конструкторов всех членов класса. Это сообщение отредактировал(а) azesmcar - 11.7.2011, 09:15 |
||||||||||||
|
|||||||||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
azesmcar, почему-то в тесте для сыроежки я увидел, а здесь нет. Видимо, из-за того, что погнался сразу за ожидаемым результатом...
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
в продолжение квеста :
сколько конструкторов копий имеет нижеследующая структура ?
Это сообщение отредактировал(а) mes - 11.7.2011, 12:55 |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
3 Маленькое замечание по тернарному ? и инициализации референсов. В большинстве случаев его можно заменить на if и тут, введя промежуточные указатели:
Исключение -
|
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
а где третий? если ты про то
Это сообщение отредактировал(а) azesmcar - 11.7.2011, 16:00 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
mes, немного отредактировал код - изначально был конструктор типа А(A&, double d=4.4) |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
mes, странно. видимо, мне, как и xvr показалось...
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
продолжим
есть ли проблемы в коде и если есть, то какие. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Есть, как минимум 2:
![]() Это сообщение отредактировал(а) xvr - 14.7.2011, 10:56 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
xvr
все верно ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |