С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
#1

"цепной" << - C++

12.02.2010, 06:45. Просмотров 1321. Ответов 16
Метки нет (Все метки)

Я просто не в курсе, так можно:
C++
1
cout << "Here is 5: " << 5 << "\ n";
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2010, 06:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос "цепной" << (C++):

Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd" - C++
вот код, нужно найти 3 минимальных положительных числа в массиве. При размере массива больше 950 в конце заполнения рандомным способом...

Найти в строке последовательность символов ("abcd") и заменить ее другой ("xyz") - C++
Найти в строке последовательность символов (&quot;abcd&quot;) и заменить ее другой (&quot;xyz&quot;).

О "нестабильности" или "переполнении" цикла foreach - C++
Здравствуйте, коллеги. Недавно коллега-программист сообщил мне страшную вещь: оказывается, что цикл foreach может переполниться при...

Ошибка: invalid conversion from "int" to "SDL_RendererFlip" - C++
Скриншот приложен, Вот страница, откуда я брал этот код Подскажите что делать

CString buff = "aaa" + "bbb" - C++
Хочется одним оператором конкатенировать несколько подстрок CString buff = &quot;aaa&quot; + &quot;bbb&quot; компилятор выдает error C2110: cannot add two...

Qt Creator. Все "за" и "против" - C++
Доброго времени суток, форумчане! Сегодня задался вопросом использования такой IDE, как Qt Creator. Суть темы заключается в том, что я...

16
Yurii_74
paladin
280 / 180 / 3
Регистрация: 25.02.2009
Сообщений: 592
12.02.2010, 07:00 #2
а почему нельзя?
Только вот "\ n" ???
Может
C++
1
cout << "Here is 5: " << 5 << endl;
1
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
12.02.2010, 17:50 #3
Можно и endl, и "\n". Первое идеологически правильнее (ну и имеет кой-какие дополнительные эффекты, но это уже тонкости).
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
24.02.2010, 05:01  [ТС] #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
ну и имеет кой-какие дополнительные эффекты
. Тогда правильнее второе. Тем более, идеологически.
Идеология c заключается в избавлении программиста от всего лишнего в коде.
Индексы элементов массива не проверяются в соответствии с идеологией языка, чтобы минимизировать время доступа.
Даже это сочли лишним, хотя именно это один из самых необходимых эффектов, а текстовые эффекты вредны всегда, когда они побочны. Нужен текстовый эффект - выводи управляющий символ именно для этого эффекта, а не нужен, так зачем от него ещё специально избавляться, когда он проявится из-за псеводоупрощений типа замены "\n" на endl? Вопрос же относится вот к чему: если я подряд поставлю два оператора, то куда бедет выведен операнд второго: в поток, или в операнд первого оператора? Если вы говорите, что "цепная" форма допустима, буду её пользоваться, если бы вы сказали, что так нельзя, писал бы
C++
1
2
3
cout<<"y=";
cout<<y;
cout<<"\n"
вместо
C++
1
cout<<"y="<<y<<"\n";
.
0
Goodwin98
2517 / 813 / 9
Регистрация: 31.05.2009
Сообщений: 1,670
24.02.2010, 05:22 #5
Скажем так, для интереса попробуйте вот такую программу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
int a;
int func()
{
  return a++;
}
 
int main()
{
  a = 0;
  cout << func() << func()<<func() << endl;
//-----------------
  a = 0;
  cout << func();
  cout << func();
  cout << func();
  cout << endl;
  return 0;
}
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
24.02.2010, 05:40  [ТС] #6
Тестил здесь.
Output:
210
012
. Ну и где сдесь эффект эндла?
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
24.02.2010, 07:30 #7
Это не эффект ендла, просто если несколько сиаутов идут подряд, то они выполняются в порядке объявления. А для цепной записи с права на лево.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
24.02.2010, 10:07  [ТС] #8
Что такое сиауты?
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
24.02.2010, 10:49 #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое сиауты?
cout - читается так.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
24.02.2010, 12:44  [ТС] #10
С конца здесь не каут выполняется, а инкременты, причём, у них ещё и общий приоритет надо всеми каутами. Уж это даже я понял.

Добавлено через 5 минут
Подумай вот о чём: куда выодит второй
C++
1
<<
? В поток, возвращенный первым
C++
1
<<
. Но тогда, пока первый не отработает, второму выводить некуда.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
24.02.2010, 16:35 #11
Здесь дело не в приоритете выполнения инкремента, а в вызовах функций и порядке вычисления аргументов. Ведь запись cout << что-то есть по сути cout.operator<<(*this, что-то);
Если "размотать" всю цепочку вызовов, то так и получится.

Добавлено через 22 минуты
Апичатка: имелось в виду cout& operator<<(cout&, что-то);
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
25.02.2010, 04:54  [ТС] #12
Тогда в "цепи"
C++
1
cout<<op1<<op2<<op3<<op4;
соотвествует
C++
1
(((cout.operator<<(op1)).operator<<(op2)).operator<<(op3)).operator<<(op4);
, а в том примере сначала вычислились все аргументы, начиная с последнего, а потом всё это вывелось.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
25.02.2010, 10:20 #13
А вычислялось оно начиная с последнего вот почему: вот у нас выражение
cout<<op1<<op2<<op3<<op4;

Рассмотрим каноническую форму оператора: cout& operator<<(cout&, что-то); - функция operator<<() принимает два аргумента, причем первый (левый) должен вычисляться в cout,
а второй (правый) - в нечто, имеющее смысл для вывода.
Рассмотрим два варианта разбора: (cout) << (op1<<op2<<op3<<op4); и (cout<<op1<<op2<<op3) << (op4);
В первом варианте левый аргумент может быть вычислен (а чего его вычислять-то?) в cout, зато правый не может быть вычислен ни во что осмысленное. Поэтому этот вариант отпадает. Во втором варианте левый аргумент может быть вычислен (последовательно рекурсивно) в cout, а правый (а чего его тут вычислять-то?) - в op4. Таким образом, второй вариант приемлем для компилятора. Ну и так далее рекурсивно.....
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
26.02.2010, 05:42  [ТС] #14
А если написать
C++
1
2
3
int x;
int y;
cout<<x<<y;
, что тогда получится?
C++
1
x<<y
может быть вычислен путём сдвига x на y бит.

Добавлено через 2 минуты
http://codepad.org/BZvWh6dv

Добавлено через 1 минуту
http://codepad.org/cqrDjyYJ

Добавлено через 30 секунд
http://codepad.org/Xi6smIAo

Добавлено через 1 минуту
http://codepad.org/QwR7JG2S
http://codepad.org/V9wNbJ9p
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
26.02.2010, 08:02 #15
Не надо путать операцию поместить в поток и операцию сдвига.
1
26.02.2010, 08:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2010, 08:02
Привет! Вот еще темы с ответами:

Ответы к упражнениям из книги Сэджвика "Фундаментальные алгоритмы на С++" части 1-4 - C++
Привет! Читаю данную книгу, в конце каждой главы имеются упражнения, но нет ответов на них. На решение некоторых задач просто нехватает...

Warning LNK4248: неразрешенная лексема TypeRef для "GLUquadric" - C++
Добрый день господа эксперты! Помогите с таким вопросом компилятор выдает: frmMain.obj : warning LNK4248: неразрешенная лексема...

Ошибка "неопределенная ссылка" при работе с std::thread - C++
При попытке сделать что-либо с std::thread, выдает ошибку компиляции, &quot;неопределенная ссылка &quot; . К примеру: #include...

Ординарная Сеть Петри для задачи об "обедающих философах" - C++
Помогите с сетью Петри. дуб в этом Задача об обедающих философах. Пять философов отдыхают в пансионате. Каждый из философов может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.