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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Квест для всех остальных 
:(
    Опции темы
azesmcar
Дата 9.7.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



У Сыроежки есть квест, а у всех остальных - нет. Стало как-то обидно и я решил устранить это досадное недоразумение.

1. есть ли какие-то принципиальные различия между тернарным оператором и оператором if, если есть, то какие.
другими словами можно ли написать что либо тернарным оператором, что нельзя написать простым if-ом
2. что будет выведено и почему?
Код

#include <iostream>

int y = 0;

int foo()
{
    return ++y;
}

int main()
{
    int x;
    x = 10, foo();
    std::cout << x << ":" << y << std::endl;
}

3. что делает этот код?
Код

std::vector<std::string> data(std::istream_iterator<std::string>(is), std::istream_iterator<std::string>());

4. что выведет код и почему?
Код

#include <iostream>

int foo(int x)
{
    return x * 2;
}
int foo(int x, int y)
{
    return x * y;
}
int main()
{
    std::cout << foo((1, 2)) << std::endl;
}

5. есть ли разница между переменными x1, x2 и x3, x4. Если есть, то какая?
Код

#include <iostream>

struct X
{
    int a;
    int b;
};

int main()
{
    X x1;
    X x2 = X();
    X* x3 = new X;
    X* x4 = new X();
}

6. Какой конструктор копирования генерирует компилятор для класса при необходимости, с константной ссылкой или нет?

пока это smile 

Это сообщение отредактировал(а) azesmcar - 9.7.2011, 14:20
PM   Вверх
fish9370
Дата 9.7.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



квест по Си, пожалуйста, в студию..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Сыроежка
Дата 9.7.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
Выделить всёкод C++
    
#include <iostream>
int y = 0;
int foo()
{
    return ++y;
}
int main()
{
    int x;
    x = 10, foo();
    std::cout << x << ":" << y << std::endl;
}



Здесь все просто . Если я правильно разглядел, то ч присваивается результат оператора "запятая", то есть последнее выражение, которое соответсвует вызову функции foo.

Функция возвращает ++y, то есть значение равное 1.

Поэтому и x. и y будут равны 1. 
Я это написал без всякой проверки с помощью компилятора.

Было бы интереснее, если бы вы написали 

 x = (y = 10, foo() );
А в самой функции не   return ++y; а   return y++;

Это сообщение отредактировал(а) Сыроежка - 9.7.2011, 20:35
PM MAIL   Вверх
Qu1nt
Дата 9.7.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 50



Сыроежка,
Цитата(gcc 4.6)

10:1

PM MAIL   Вверх
volatile
Дата 9.7.2011, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 85



Цитата(Сыроежка @  9.7.2011,  20:34 Найти цитируемый пост)
Здесь все просто . Если я правильно разглядел, то ч присваивается результат оператора "запятая", то есть последнее выражение, которое соответсвует вызову функции foo.
Функция возвращает ++y, то есть значение равное 1.
Поэтому и x. и y будут равны 1. 

У оператора запятая, приоритет ниже чем у оператора присваивания.
Знатоку тонкостей автоматического приведения типов, как-то не к лицу путаться с приоритетами.

Но хоть, по крайней мере, честно

PM MAIL   Вверх
voral
Дата 9.7.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Мда.... 4ый не допетрил почему поучилось то, что получилось smile Какой урок я "пропустил в школе"? 
PM MAIL WWW   Вверх
volatile
Дата 10.7.2011, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 85



Цитата(voral @  9.7.2011,  23:44 Найти цитируемый пост)
4ый не допетрил почему поучилось то, что получилось  


Код

std::cout << foo((1, 2)) << std::endl;

voral, Здесь идет вызов foo(2);
так как (1, 2) заключен в скобки, это всё - первый аргумент. Единица просто теряется, остается 2




Это сообщение отредактировал(а) volatile - 10.7.2011, 00:10
PM MAIL   Вверх
boostcoder
Дата 10.7.2011, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 20
Всего: 110



не хочу торопить события... но сыроежко пустозвон? как мальчик колокольчик? я именно так и понял его ответы)
PM WWW   Вверх
voral
Дата 10.7.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(volatile @  10.7.2011,  00:08 Найти цитируемый пост)
Единица просто теряется, остается 2

Вот как раз почему теряется единица, а не двойка я не понимаю.
Ведь если
Код

int i = 1,2;

То i будет 1......

Добавлено через 4 минуты и 55 секунд
Какая логика компиляции?
Код

    i= (1,2);

PM MAIL WWW   Вверх
volatile
Дата 10.7.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 85



Цитата(voral @  10.7.2011,  10:03 Найти цитируемый пост)
int i = 1,2;

У присваивания приоритет выше
выполняется так
i = 1;
2;

Здесь можно задать вопрос почему в программе можно писать 2; и это не будет ошибкой.  
Можете попробовать.
Корректная (хотя и абсолютно бесполезная) программа:
Код

1234;
23345;
0x3324;
334;


http://liveworkspace.org/code/5b387bc649b1...a41564ee35503fa
smile 
PM MAIL   Вверх
voral
Дата 10.7.2011, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(volatile @  10.7.2011,  10:26 Найти цитируемый пост)
У присваивания приоритет выше

Я это знаю.  И понимаю, почему выбрано именно 1.

И сам же сказал, что будет 1.  Меня больше интересует вопрос почему 
Код

i =  (1,2);

здесь будет равно 2.

Пробовал подставлять функции - отрабатывают обе. Правильно ли я понимаю, что здесь, упрощенно, раскладывается на две операции:
i=1;
i=2;
соответственно первая в компилированный код не идет за ненадобностью. (Если функция то она вызывается)
Поэкспериментировал с gdb
Код

// i = 1;
0x00000000004008a2 <main+0>:    push   %rbp
0x00000000004008a3 <main+1>:    mov    %rsp,%rbp
0x00000000004008a6 <main+4>:    movl   $0x1,-0x4(%rbp)
0x00000000004008ad <main+11>:   mov    $0x0,%eax
0x00000000004008b2 <main+16>:   leaveq
0x00000000004008b3 <main+17>:   retq

//    i= 1,2;
0x00000000004006b4 <main+0>:    push   %rbp
0x00000000004006b5 <main+1>:    mov    %rsp,%rbp
0x00000000004006b8 <main+4>:    movl   $0x1,-0x4(%rbp)
0x00000000004006bf <main+11>:   mov    $0x0,%eax
0x00000000004006c4 <main+16>:   leaveq
0x00000000004006c5 <main+17>:   retq

//    i= (1,2);
0x00000000004006b4 <main+0>:    push   %rbp
0x00000000004006b5 <main+1>:    mov    %rsp,%rbp
0x00000000004006b8 <main+4>:    movl   $0x2,-0x4(%rbp)
0x00000000004006bf <main+11>:   mov    $0x0,%eax
0x00000000004006c4 <main+16>:   leaveq
0x00000000004006c5 <main+17>:   retq

//    i= (1,2,3);
0x00000000004006b4 <main+0>:    push   %rbp
0x00000000004006b5 <main+1>:    mov    %rsp,%rbp
0x00000000004006b8 <main+4>:    movl   $0x1,-0x4(%rbp)
0x00000000004006bf <main+11>:   mov    $0x0,%eax
0x00000000004006c4 <main+16>:   leaveq
0x00000000004006c5 <main+17>:   retq





PM MAIL WWW   Вверх
asmdzen
Дата 10.7.2011, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

Репутация: 3
Всего: 5



Цитата(voral @  10.7.2011,  12:23 Найти цитируемый пост)
И сам же сказал, что будет 1.  Меня больше интересует вопрос почему 
Выделить всёкод C++
1:
    
i =  (1,2);

здесь будет равно 2.


потому что скобки меняют приоритет и результатом (1,2) будет 2.
PM MAIL   Вверх
volatile
Дата 10.7.2011, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 16
Всего: 85



Цитата(voral @  10.7.2011,  12:23 Найти цитируемый пост)
Меня больше интересует вопрос почему 
i =  (1,2);


Потому-что скобки. (Разве не очевидно?)  smile 
Сначала, вычисляется выражение в скобках
temp = 1;
temp = 2;
и потом присваивается переменной
i = temp;

Ну где-то так..

Смотреть на асме - естественно бесполезно.
Любой мало-мальский оптимизатор зарубит это на корню.

Добавлено через 1 минуту и 29 секунд
Упс, пока я тут заваривал кофе asmdzen, уже ответил. Сорри.
PM MAIL   Вверх
asmdzen
Дата 10.7.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

Репутация: 3
Всего: 5



volatile, lock(thread) забыл  smile 

Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
 можно ли написать что либо тернарным оператором, что нельзя написать простым if-ом

параметры функции?
типа:
Код

void myFunc(int x);

int y,z;
myFunc(y>z ? y: z); // call with max value


Это сообщение отредактировал(а) asmdzen - 10.7.2011, 12:46
PM MAIL   Вверх
azesmcar
Дата 10.7.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(asmdzen @  10.7.2011,  12:42 Найти цитируемый пост)

параметры функции?
типа:

это можно написать с помощью if, код будет выглядеть иначе, но можно.

Добавлено через 1 минуту и 3 секунды
Цитата(voral @  10.7.2011,  12:23 Найти цитируемый пост)

Я это знаю.  И понимаю, почему выбрано именно 1.

И сам же сказал, что будет 1.  Меня больше интересует вопрос почему 

так работает оператор запятая. не совсем понятно в чем вопрос.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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