Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

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

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

Я просто не в курсе, так можно:
C++
1
cout << "Here is 5: " << 5 << "\ n";
?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Yurii_74
paladin
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
12.02.2010, 07:00     "цепной" << #2
а почему нельзя?
Только вот "\ n" ???
Может
C++
1
cout << "Here is 5: " << 5 << endl;
Nick Alte
Эксперт С++
1603 / 995 / 118
Регистрация: 27.09.2009
Сообщений: 1,918
Завершенные тесты: 1
12.02.2010, 17:50     "цепной" << #3
Можно и endl, и "\n". Первое идеологически правильнее (ну и имеет кой-какие дополнительные эффекты, но это уже тонкости).
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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";
.
Goodwin98
2517 / 813 / 9
Регистрация: 31.05.2009
Сообщений: 1,671
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;
}
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2010, 05:40  [ТС]     "цепной" << #6
Тестил здесь.
Output:
210
012
. Ну и где сдесь эффект эндла?
kazak
3031 / 2352 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
24.02.2010, 07:30     "цепной" << #7
Это не эффект ендла, просто если несколько сиаутов идут подряд, то они выполняются в порядке объявления. А для цепной записи с права на лево.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2010, 10:07  [ТС]     "цепной" << #8
Что такое сиауты?
kazak
3031 / 2352 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
24.02.2010, 10:49     "цепной" << #9
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое сиауты?
cout - читается так.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2010, 12:44  [ТС]     "цепной" << #10
С конца здесь не каут выполняется, а инкременты, причём, у них ещё и общий приоритет надо всеми каутами. Уж это даже я понял.

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

Добавлено через 22 минуты
Апичатка: имелось в виду cout& operator<<(cout&, что-то);
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.02.2010, 04:54  [ТС]     "цепной" << #12
Тогда в "цепи"
C++
1
cout<<op1<<op2<<op3<<op4;
соотвествует
C++
1
(((cout.operator<<(op1)).operator<<(op2)).operator<<(op3)).operator<<(op4);
, а в том примере сначала вычислились все аргументы, начиная с последнего, а потом всё это вывелось.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
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. Таким образом, второй вариант приемлем для компилятора. Ну и так далее рекурсивно.....
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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
kazak
3031 / 2352 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
26.02.2010, 08:02     "цепной" << #15
Не надо путать операцию поместить в поток и операцию сдвига.
Yurii_74
paladin
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
26.02.2010, 08:24     "цепной" << #16
Цитата Сообщение от taras atavin Посмотреть сообщение
А если написать
C++
1
2
3
int x;
int y;
cout<<x<<y;
Расставляй скобки, избегай неоднозначностей (хотя в данном примере никакой неоднозначности нет). Не заставляй коллег напрягать извилины в попытках разобрать, что ты хотел получить.
Хочешь сдвиг, пиши явно:
C++
1
cout << (x << y);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2010, 06:33     "цепной" <<
Еще ссылки по теме:

Замените все буквы "р" на сочетание "ку" C++
C++ Заменить "fopen" в c++ на "TOpenDialog" в Builder6
Замена "conio.h" и "gotoXY" в Xcode C++
C++ Ошибка: invalid conversion from "int" to "SDL_RendererFlip"
C++ COM Невозможно преобразовать "const _GUID" в "DllCustomWrapper::IDll *"

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.02.2010, 06:33  [ТС]     "цепной" << #17
Я хочу вывод в поток, что и делает компил. Но ведь это надо знать, что порядок этого оператора всегда слева на право, так как анализ на основе только возможности вычисления операндов как раз и приводит к неоднозначности, которой на самом деле нет.
Yandex
Объявления
27.02.2010, 06:33     "цепной" <<
Ответ Создать тему
Опции темы

Текущее время: 09:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru