Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Выражения. Особенности вывода кириллицы

Особенности вывода кириллицы

Задача вывода русских букв в консольное окно является частным случаем сложной проблемы локализации приложений. К локализации, кроме возможности использования национального алфавита, относятся, например, представление даты, времени и обозначение национальной валюты.

Коды символов определяются реализацией, в частности, возможностями операционной системы. Набор кодов для некоторого множества символов называется кодовой страницей (кодировкой).Проблема вывода русских букв в консольное окно возникла при переходе от операционной системы MS DOS к системе Windows. В консольном окне Windows по умолчанию используется кодировка, принятая в MS DOS, для того чтобы старые программы MS DOS правильно работали в консольном окне Windows. Однако среда разработки Visual Studio.NET 2005 работает в системе Windows, в которой по умолчанию установлена другая кодовая страница. Русские символы, набираемые в окне редактора среды, имеют другую кодировку, и поэтому в консольном окне видны как "иероглифы".

Есть множество способов решения этой проблемы. Самый простой - вообще отказаться от русских букв. Если же все-таки хочется их использовать, проще всего воспользоваться функцией setlocale, унаследованной из языка С (она описана в заголовочном файле <clocale>):

setlocale(LC_ALL, "Russian");setlocale(LC_ALL, "rus");

Любой из этих вызовов устанавливает русскую локаль,после чего русские константы выводятся в консольное окно по-русски при использовании и printf, и cout.

Чтобы русификация консольного окна работала, необходимо, чтобы в операционной системе Windows в настройках языков и стандартов была установлена кириллица по умолчанию.

В любой программе требуется производить вычисления. Для вычисления значений используются выражения, которые состоят из операндов, знаков операций и скобок. В приведенных выше примерах программ выражения использовались для вычисления суммы в рублях. Другие примеры выражений:

(a + 0.12) / 6x && y ||! z(t * sin(x) - 1.05e4) / ((2 * k + 2) * (2 * k + 3))a = b = c b++cout << ai++, j++

Операнды задают данные для вычислений. Операции задают действия, которые необходимо выполнить. Каждый операнд является, в свою очередь, выражением или одним из его частных случаев, например, константой или переменной. Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Уровень их вложенности не ограничен.

Язык С++ предоставляет в наше распоряжение внушительный набор операций: арифметические, логические, поразрядные, операции отношения, выделения памяти, преобразования типа, выбора и т. д. В таблице 2.1 приведены простейшие операции, с которых мы начнем изучение.

Таблица 2.1. Простейшие операции языка С++
Операция Краткое описание
Унарные операции
++ постфиксный инкремент
-- постфиксный декремент
sizeof размер объекта или типа
-- префиксный декремент
++ префиксный инкремент
! логическое отрицание
- арифметическое отрицание (унарный минус)
+ унарный плюс
(<тип>) преобразование типа
Бинарные и тернарная операции
* умножение
/ деление
% остаток от деления
+ сложение
- вычитание
< меньше
<= меньше или равно
> больше
>= больше или равно
== равно
!= не равно
&& логическое И
|| логическое ИЛИ
?: условная операция (тернарная)
= присваивание
*= умножение с присваиванием
/= деление с присваиванием
%= остаток отделения с присваиванием
+= сложение с присваиванием
-= вычитание с присваиванием
, последовательное вычисление

Операции расположены в порядке убывания приоритета, операции с разными приоритетами отделены горизонтальной чертой. Уровней приоритетов в языке С++ огорчительно много, поэтому в случае сомнений надо не лениться обращаться к справочной информации. Основные правила, тем не менее, просты и соответствуют принятым в математике: например, вычитание имеет более низкий приоритет, чем умножение, поэтому для того, чтобы оно было выполнено раньше, соответствующая часть выражения заключается в скобки.

Если в одном выражении записано несколько операций одинакового приоритета, то унарные операции, условная операция и операции присваивания выполняются справа налево, остальные - слева направо. Например, a = b = c означает a = (b = c), а a + b + c означает (a + b) + c.

Порядок вычисления операндов в выражении не определен: например, нельзя считать, что в выражении (sin(x + 2) + cos(y + 1)) обращение к синусу будет выполнено раньше, чем к косинусу. Только четыре операции гарантируют порядок вычислений слева направо: ,,?:, && и ||.

Результат вычисления выражения характеризуется значением и типом. Например, пусть описаны две переменные целого типа a и b:

int a = 2, b = 5;

Тогда выражение a + b имеет значение 7 и тип int. В С++ различаются так называемые L-значения (L-value) и R-значения (R-value). Название произошло от операции присваивания:

  • Выражение, являющееся L -значением (от слова Left - левый), может располагаться как с левой, так и с правой стороны операции присваивания;
  • Выражение, являющееся R -значением (от слова Right - правый), может располагаться только с правой, но никак не с левой стороны операции присваивания.

Выражения возвращают в качестве результата либо L -значения, либо R -значения. Переменная - частный случай L -значения, а константа - частный случай R -значения. Более общим случаем R -значения является обычное арифметическое выражение. L -значением в общем случае может быть не только переменная, но и некоторое выражение, ссылающееся на область памяти. В дальнейшем мы будем указывать, какие операции возвращают L -значение.

Рассмотрим подробнее некоторые операции.

Операции присваивания (=, +=, -=, *= и т. д.). Формат операции простого присваивания (=):

операнд_1 = операнд_2

Левым операндом должно быть L -значение, а правым - любое выражение. Сначала вычисляется выражение, стоящее в правой части операции, а потом его результат записывается в область памяти, ссылка на которую стоит в левой части (мнемоническое правило: "присваивание - это передача данных "налево""). В простейшем и наиболее распространенном случае левый операнд представляет собой переменную, куда и записывается вычисленное значение. То, что ранее хранилось в этой переменной, естественно, теряется.

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

Выражение с операцией присваивания может участвовать в качестве операнда в других выражениях. Например, оно может быть аргументом операции сложения.

Результат выражения с присваиванием является L -значением, поэтому выражение с присваиванием может быть аргументом другой операции присваивания. Таким образом, допустимы многократные присваивания вида a = b = c: сначала вычисляется выражение b = c, а затем его результат становится правым операндом для операции присваивания переменной a.

Выражения с операциями присваивания могут использоваться и как самостоятельные операторы. Для этого нужно после выражения поставить точку с запятой. Пример операции присваивания:

#include <iostream>using namespace std;int main(){ int a = 3, b = 5, с = 7; // инициализация a = b; b = a; с = с + 1; // присваивание cout << "a = " << a << " b = " << b << " c = " << c; с = a + (b = 5); cout << " c = " << c;}

Результат работы программы:

a = 5 b = 5 c = 8 с = 10

В составных операциях присваивания (+=, *=, /= и т. п.) при вычислении выражения, стоящего в правой части, используется и L -значение из левой части. Например, при сложении с присваиванием к значению левого операнда прибавляется значение правого, и результат записывается в левый операнд. Таким образом, выражение a += b является более компактной записью выражения a = a + b.

Операции увеличения и уменьшения на 1 (++ и --). Эти операции, называемые также инкрементом и декрементом, имеют две формы записи - префиксную, когда операция записывается перед операндом, и постфиксную. В префиксной форме сначала изменяется операнд, и новое значение является результатом операции. В постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется:

#include <cstdio>using namespace std;int main(){ int x = 3, y = 3; printf("Значение префиксного выражения: %d ", ++x); printf("Значение постфиксного выражения: %d ", y++); printf("Значение х после приращения: %d ", x); printf("Значение у после приращения: %d ", у); }

Результат работы программы:

Значение префиксного выражения: 4Значение постфиксного выражения: 3Значение х после приращения: 4Значение у после приращения: 4

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

Операции отрицания (-,!). Арифметическое отрицание (унарный минус -) изменяет знак операнда целого или вещественного типа на противоположный. Логическое отрицание (!) дает в результате значение false, если операнд есть true, и значение true, если операнд равен false. Операнд может быть арифметического типа. В этом случае выполняется неявное преобразование в тип bool.

Деление (/) и остаток от деления (%). Операция деления применима к операндам арифметического типа. Если оба операнда целочисленные, результатом операции является целая часть частного (дробная часть отсекается). Например, результатом 5/2 будет 2. Если же хотя бы один операнд вещественный, то и результат будет вещественным числом. В этом случае тип результата определяется правилами преобразования типов, которые рассмотрены в следующем разделе. Операция остатка от деления применяется только к целочисленным операндам. Знак результата зависит от реализации.

#include <cstdio>using namespace std;int main(){int x = 11, y = 4; float z = 4; printf("Результаты деления: %d %f ", x / y, x / z); printf("Остаток: %d ", x % y); }

Результат работы программы:

Результаты деления: 2 2.750000Остаток: 3

Операции отношения (<, <=, >, >=, ==,!=) сравнивают первый операнд со вторым. Операнды могут быть арифметического типа или указателями. Результатом операции является значение true или false. Операции сравнения на равенство и неравенство имеют меньший приоритет, чем остальные операции сравнения.

ВНИМАНИЕ Обратите внимание на разницу между операцией проверки на равенство (==) и операцией присваивания (=), результатом которой является значение, присвоенное левому операнду.

Логические операции (&& и ||). Операнды логических операций И (&&) и ИЛИ (||) должны иметь тип, допускающий преобразование к типу bool, при этом операнды в одной операции могут быть различных типов. Результатом операции является true или false. Результат операции логическое И имеет значение true только если оба операнда имеют значение true. Результат операции логическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true. Логические операции выполняются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется.

Условная операция (?:).Эта единственная в С++ тернарная операция (имеет три операнда), ее формат:

операнд_1? операнд_2: операнд_3

Операнды вычисляются слева направо. Результат вычисления первого операнда должен быть типа, который можно преобразовать к типу bool. Если результат равен true, то результатом выполнения всей условной операции будет значение второго операнда, иначе - третьего операнда. Их типы могут быть различными.

Пример: пусть требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает n, а иначе принимала значение 1. Это можно записать с помощью одной строки кода:

i = (i < n)? i + 1: 1;

Операция последовательного вычисления "запятая" (,). Формат операции:

выражение_1, выражение_2

Операция выполняется слева направо: сначала вычисляется выражение слева от знака операции (его результат отбрасывается), а затем вычисляется выражение справа от знака и его результат принимается за результат операции. Вычисление левого выражения обязательно завершается до того, как начнется вычисление правого выражения. Это позволяет присваивать значения переменным в левом выражении, а затем использовать их в правом. Например, результатом операции j = 2, j = 1 будет 1, результатом операции j = 2, j++ будет 2, а результатом операции j = 2, ++j будет 3.

Стандарт разрешает любое выражение заменить последовательностью выражений, разделенных операцией "запятая". Результатом вычисления последовательности выражений будет значение самого правого выражения.

Операции, не рассмотренные в этом разделе, будут описаны по мере необходимости.

<== предыдущая лекция | следующая лекция ==>
Простейшие средства ввода/вывода | Преобразования базовых типов
Поделиться с друзьями:


Дата добавления: 2014-01-20; Просмотров: 382; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.021 сек.