Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
1

"цепной" <<

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

Я просто не в курсе, так можно:
C++
1
cout << "Here is 5: " << 5 << "\ n";
?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2010, 06:45
Ответы с готовыми решениями:

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

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

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

Вывести фигуру, состоящую из букв "а" и "b"
Пользователем задаются параметры: h- высота фигуры, w - ширина фигуры, s - размер.Запрещено...

16
paladin
285 / 185 / 7
Регистрация: 25.02.2009
Сообщений: 589
12.02.2010, 07:00 2
а почему нельзя?
Только вот "\ n" ???
Может
C++
1
cout << "Here is 5: " << 5 << endl;
1
Эксперт С++
1667 / 1039 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
12.02.2010, 17:50 3
Можно и endl, и "\n". Первое идеологически правильнее (ну и имеет кой-какие дополнительные эффекты, но это уже тонкости).
0
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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
2531 / 827 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
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
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
24.02.2010, 05:40  [ТС] 6
Тестил здесь.
Output:
210
012
. Ну и где сдесь эффект эндла?
0
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
24.02.2010, 07:30 7
Это не эффект ендла, просто если несколько сиаутов идут подряд, то они выполняются в порядке объявления. А для цепной записи с права на лево.
0
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
24.02.2010, 10:07  [ТС] 8
Что такое сиауты?
0
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
24.02.2010, 10:49 9
Цитата Сообщение от taras atavin Посмотреть сообщение
Что такое сиауты?
cout - читается так.
0
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
24.02.2010, 12:44  [ТС] 10
С конца здесь не каут выполняется, а инкременты, причём, у них ещё и общий приоритет надо всеми каутами. Уж это даже я понял.

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

Добавлено через 22 минуты
Апичатка: имелось в виду cout& operator<<(cout&, что-то);
0
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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
Эксперт С++
2921 / 1270 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
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
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
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
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
26.02.2010, 08:02 15
Не надо путать операцию поместить в поток и операцию сдвига.
1
paladin
285 / 185 / 7
Регистрация: 25.02.2009
Сообщений: 589
26.02.2010, 08:24 16
Цитата Сообщение от taras atavin Посмотреть сообщение
А если написать
C++
1
2
3
int x;
int y;
cout<<x<<y;
Расставляй скобки, избегай неоднозначностей (хотя в данном примере никакой неоднозначности нет). Не заставляй коллег напрягать извилины в попытках разобрать, что ты хотел получить.
Хочешь сдвиг, пиши явно:
C++
1
cout << (x << y);
1
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
27.02.2010, 06:33  [ТС] 17
Я хочу вывод в поток, что и делает компил. Но ведь это надо знать, что порядок этого оператора всегда слева на право, так как анализ на основе только возможности вычисления операндов как раз и приводит к неоднозначности, которой на самом деле нет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2010, 06:33

CString buff = "aaa" + "bbb"
Хочется одним оператором конкатенировать несколько подстрок CString buff = &quot;aaa&quot; + &quot;bbb&quot;...

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

Ошибка E0167 аргумент типа "unsigned char *" несовместим с параметром типа "const char *"
Всем привет, подскажите пожалуйста, в проекте MS Visual Studio 2017 напротив строчки...

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


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

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

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