Я изучаю C ++ и только начал читать «Принципы и практика программирования» Бьярна Страуструпа, и он использует этот код для иллюстрации:
#include "std_lib_facilities.h"
using namespace std;
int main() // C++ programs start by executing the function main
{
char c = 'x';
int i1 = c;
int i2 = 'x';
char c2 = i1;
cout << c << ' << i1 << ' << c2 << '\n';
return 0;
}
Я в целом знаком с разницей между двойными и одинарными кавычками в мире C ++, но кто-то любезно объяснит структуру и назначение раздела ‘ << i1 << ‘
Спасибо
cout << c << ' << i1 << ' << c2 << '\n';
кажется опечаткой в книге. Я вижу это в Принципах и практике программирования с использованием C ++ (второе издание). Я не вижу его в списке ошибок.
Согласно книге, предполагаемый результат
x 120 x
Но что здесь происходит ' << i1 << '
пытается сжать << i1 <<
в многобайтовый символ и выводит целое число (наиболее вероятно 540818464-> 0x203C3C20 -> ASCII-значения ' ', '<', '<', ' '
) так как cout
не знает широких символов. Вам нужно wcout
для этого. Конечный результат выводит что-то вроде
x540818464x
и одно или два предупреждения от компилятора, потому что, хотя это допустимый код C ++, это почти наверняка не то, что вы хотите делать.
Скорее всего, строка должна прочитать
cout << c << ' ' << i1 << ' ' << c2 << '\n';
который выведет ожидаемый x 120 x
Другими словами, Linker3000, вы не сошли с ума и не неправильно поняли пример кода.
Кто-нибудь знает, с кем мне следует связаться, чтобы получить информацию об ошибках или получить разъяснения по поводу того, что над моей головой скрывается какая-то сверхсекретная подлость?
Прежде чем ответить на ваш вопрос, вот небольшая справка о том, что это на самом деле делает. Также обратите внимание, что в примере есть опечатка, строковая константа должна была заключаться в двойные кавычки:
cout << c << " << i1 << " << c2 << "\n";
В C ++ операторы могут быть перегружены, так что они означают разные вещи с разными функциями. В случае cout, << оператор перегружен как «оператор вставки». Представьте, что вы берете операнд справа и вставляете его (или отправляете) в оператор слева.
Например,
cout << "Hello World";
Это берет строку «Hello World» и отправляет ее cout для обработки.
Так что новички не получают, что-то вроде этого означает:
cout << "Hello" << " World";
Это делает то же самое, но приоритет оператора говорит выполнять инъекции слева направо. Чтобы заставить это работать, объект cout возвращает себя как возвращаемое значение функции. Почему это важно? Потому что вышеприведенное утверждение на самом деле является двумя отдельными оценками операторов:
(cout << "Hello") << " World";
Это сначала вводит «Hello» в cout, который выводит его, затем продолжает вычислять следующий оператор ввода. Потому что Cout возвращает себя, после (Cout << «Привет»), у вас есть следующее, что еще нужно оценить:
cout << " World";
Это выражение вводит «World» в объект cout, который затем выводит «World», в результате чего вы видите «Hello World», как в первый раз.
Так что в вашем примере, что это делает?
cout << c << " << i1 << " << c2 << "\n";
Это оценивается слева направо следующим образом:
((((cout << c) << " << i1 << ") << c2) << "\n"); => Outputs value of c
((((cout ) << " << i1 << ") << c2) << "\n"); => Outputs string " << i1 << "((( cout ) << c2) << "\n"); => Outputs value of c2
(( cout ) << "\n"); => Outputs newline character
( cout ); => No more output
Выражение завершается и возвращает объект cout в качестве значения выражения.
Предполагая, что c = ‘x’ и c2 = ‘x’, окончательный вывод этого выражения будет следующей строкой символов в одной строке:
x << i1 << x
Для начинающих, все эти операторы вставки << выглядеть немного странно. Это потому, что вы имеете дело с объектами. Вы можете создать строку как полностью отформатированный объект, прежде чем вводить ее в cout, и хотя это делает выражение cout более простым, мы не делаем этого в C ++, потому что это делает ваш код более сложным и подверженным ошибкам. Обратите внимание, что в объекте cout нет ничего особенного. Если вы хотите выводить данные в стандартный поток ошибок, вместо этого вы должны использовать cerr. Если бы вы хотели вывести в файл, вы бы создали объект потока, который выдает в нужный файл. Остальная часть кода в вашем примере будет такой же.
В C то же самое будет сделано процедурно с использованием строки формата:
printf("%d << i1 << %d\n", i1, c2);
Это допустимо и в C ++, потому что C ++ является надмножеством C. Многие программисты C ++ до сих пор используют этот метод вывода, но это потому, что эти программисты сначала изучили C и, возможно, не полностью приняли объектно-ориентированную природу C ++
Обратите внимание, что вы, возможно, также видели << оператор в контексте математических выражений типа:
A = A << 8;
В этом случае << Оператор — операция побитового поворота. Это не имеет ничего общего с выводом на cout. Он повернет биты в А влево на восемь битов.