Tuesday, December 23, 2014

19.1.1 Операторууд (operators)

Хүснэгт 19.2. С++ хэлний операторууд

Оператор
Oперанд
Тайлбар
Жишээ
Нийцэл
XA
::
нэг
глобал үйлчлэх хүрээг заана
:: name
<
-
::
хоёр
класс/нэрийн мужийн үйлчлэх хүрээг заана
className::memberName
>
-
->
хоёр
гишүүн элементийг заагчаар дамжуулан сонгох
ptr->memberName
>
-
.
хоёр
гишүүн элементийг обьектоор дамжуулан сонгох
obj.memberName
>
-
->
нэг
ухаалаг заагч
obj->member
<
Г
[ ]
хоёр
индексийг заана
ptr[expr]
>
Г
( )
дурын [a]
функц дуудах
function(argList)
>
-
( )
дурын
анхны утгыг оноох
className(argList)
>
Г
++
нэг
постфикс нэмэгдүүлэх
varName++
<
+
--
нэг
постфикс хорогдуулах
varName--
<
+
typeid
нэг
төрөл тогтоох
typeid(type) or typeid(expr)
<
-
dynamic_cast
хоёр
төрлийг хяналттайгаар динамик горимд хувиргах
dynamic_cast<type>(expr)
>
-
static_cast
хоёр
төрлийг хяналттайгаар статик горимд хувиргах
static_cast<type>(expr)
>
-
reinterpret_cast
хоёр
төрлийг хянахгүй хувиргах
reinterpret_cast<type>(expr)
>
-
const_cast
хоёр
тогтмолыг хувиргах
const_cast<type>(expr)
>
-
sizeof
нэг
хэмжээг байтаар илэрхийлэх
sizeof expr or sizeof(type)
<
-
++
нэг
префикс нэмэгдүүлэх
++varName
<
+
--
нэг
префикс хорогдуулах
--varName
<
+
~
нэг
бит дээрх үгүйсгэл
~ expr
<
+
!
нэг
логик үгүйсгэл
! expr
<
+
+, -
нэг
унарy plus, unary minus
+expr or -expr
<
+
*
нэг
заагчийн агуулгыг сонгох
* ptr
<
+
&
нэг
хаяг тогтоох
& lvalue
<
+
new
нэг
санах ой хуваарилах
new type or new type(expr-list)
<
+
new [ ]
нэг
дараалласан санах ой хуваарилах
new type [ size ]
>
+
delete
нэг
хуваарилсан санах ойг чөлөөлөх
delete ptr
<
+
delete [ ]
нэг
дарааллан хуваарилсан санах ойг чөлөөлөх
delete [ ] ptr
<
Г
( )
хоёр
төрлийг шилжүүлэх С хэлний хэлбэр
( type ) expr
<
- [b]
->*
хоёр
заагчийн тусламжтайгаар гишүүн заагчийг сонгох
ptr->*ptrToMember
>
Г
.*
хоёр
обьектийн тусламжтайгаар гишүүн заагчийг сонгох
obj.*ptrToMember
>
-
*
хоёр
үржүүлэх
expr1 * expr2
>
+
/
хоёр
хуваах
expr1 / expr2
>
+
%
хоёр
хуваалтын үлдэгдэл олох
expr1 % expr2
>
+
+
хоёр
нэмэх
expr1 + expr2
>
+
-
хоёр
хасах
expr1 - expr2
>
+
<<
хоёр
зүүн тийш шилжүүлэх
expr << shiftAmt
>
+
>>
хоёр
баруун тийш шилжүүлэх
expr >> shiftAmt
>
+
<
хоёр
бага
expr1 < expr2
>
+
<=
хоёр
бага буюу тэнцүү
expr1 <= expr2
>
+
>
хоёр
их
expr1 > expr2
>
+
>=
хоёр
их буюу тэнцүү
expr1 >= expr2
>
+
==
хоёр
тэнцүү [c]
expr1 == expr2
>
+
!=
хоёр
тэнцүү биш
expr1 != expr2
>
+
&
хоёр
бит AND
expr1 & expr2
>
+
^
хоёр
бит XOR
expr1 ^ e2
>
+
|
хоёр
бит OR
expr1 | expr2
>
+
&&
хоёр
логик AND
expr1 && expr2
>
+
||
хоёр
логик OR
expr1 || expr2
>
+
=
хоёр
утга оноох
expr1 = expr2
<
+
*=
хоёр
үржүүлж утга оноох
expr1 *= expr2
<
+
/=
хоёр
хувааж утга оноох
expr1 /= expr2
<
+
%=
хоёр
хуваалтын үлдэгдлээр утга оноох
expr1 %= expr2
<
+
+=
хоёр
нэмж утга оноох
expr1 += expr2
<
+
-=
хоёр
хасаж утга оноох
expr1 -= expr2
<
+
<<=
хоёр
зүүн шилжүүлж утга оноох
expr1 <<= expr2
<
+
>>=
хоёр
баруун шилжүүлж утга оноох
expr1 >>= expr2
<
+
&=
хоёр
AND үйлдлээр утга оноох
expr1 &= expr2
<
+
|=
хоёр
ОR үйлдлээр утга оноох
expr1 |= expr2
<
+
^=
хоёр
ХOR үйлдлээр утга оноох
expr1 ^= expr2
<
+
? :
гурав
нөхцөлт илэрхийлэл
bool ? expr : expr
>
-
throw
нэг
Throw exception
throw expr
<
-
,
хоёр
дэс дараалан гүйцэтгэх
expr , expr
>
+
[a] Функц дуудах операторын операндын тоо хэмжээ дурын байж болно.
[b] Төрөл хувиргах оператор нь хэрэглэгчийн тодорхойлсон төрлийг хувиргахдаа байгуулагч эсвэл хувиргалтын операторуудыг ашиглаж болно.
[c] Энэ операторыг float эсвэл double төрлийн операндуудад хэрэглэж болохгүй.

Wednesday, December 17, 2014

19.1. Операторууд (operators)

Операторуудыг хэрэглэгдэх байдлаар нь ангилан ялгавал:

утга оноох операторууд =, +=, *=, …
арифметик операторууд
+, -, *, %
жиших операторууд
<, <=, >, >=, ==, !=
логик операторууд
&&, ||, !
бит операторууд
&, |, ^, ~, <<, >>
санах ойн удирдлагын операторууд
new, delete, sizeof
заагч болон хандалтын операторууд
*, &, ., ->, [], ()
үйлчлэх хүрээний оператор
::
бусад операторууд
conditional(?:), comma(,)

С++ стандартад тодорхой түлхүүр үгнүүдийг (keyword) зарим операторын орлуулгын нэрээр (alias) оноож өгсөн байдаг.

19.1. Хүснэгт, операторын орлуулгын нэрс

Оператор
Орлуулах нэр
&& and
& bitand
&= and_eq
|| or
| bitor
|= or_eq
^ xor
^= xor_eq
! not
!= not_eq
~ compl

Ихэнх (гэхдээ бүгд биш) дотоод төрлүүдийн (built-in type) хувьд операторуудыг урьдчилан тодорхойлсон байдаг.

Операторын шинж чанар (operator characteristics)

Операторууд дараах онцгой шинж чанарыг агуулна:
  • эрэмбэ (precedence)
  • нийцэл (associativity)
  • шаардагдах операндын тоо (number of required operands)

19.2. хүснэгтэд С++ хэлний бүх операторуудыг эрэмбээр нь жагсаан (өндөр эрэмбийн операторууд жагсаалтын дээд хэсэгт), хэрэглээний дагуу бүлэглэн харуулав.
  • Операнд багана тухайн операторт шаардлагатай операндын тоог харуулна.
  • Тайлбар багана тухайн операторын дотоод төрөлд зориулсан тодорхойлолтыг агуулна.
  • Нийцэл багана хэрэв ижил оператор нэгэн зэрэг олон тоогоор хэрэглэгдвэл хоорондоо хэрхэн нийцэхийг үзүүлнэ. Үүнд:
    • >“ тэмдэглэгээ зүүнээс баруун гэсэн нийцлийг илтгэнэ. Жишээ нь:
      d = a + b + c; // эхэлж a + b үйлдлийг, дараа нь (a + b) + c үйлдлийг гүйцэтгэнэ.
    • <“ тэмдэглэгээ баруунаас зүүн гэсэн нийцлийг илтгэнэ. Жишээ нь:
      c = b = a; // а эхэлж b-д, дараа нь с-д оноогдоно.
  • Хэт ачаалал (XA) багана тухайн операторыг хэрэглэгчийн төрөлд дахин шинээр тодорхойлох боломжтой эсэхийг харуулна.
    • +” тэмдэглэгээ нь операторыг глобал, эсвэл гишүүн функц хэлбэрээр хэтрүүлэн ачааллах боломжтойг илтгэнэ.
    • Г” тэмдэглэгээ нь операторыг зөвхөн гишүүн функц хэлбэрээр хэтрүүлэн ачааллах боломжтойг илтгэнэ.
    • -“ тэмдэглэгээ нь операторыг хэтрүүлэх ачааллах боломжгүйг илтгэнэ.

Monday, December 15, 2014

19-бүлэг. Төрөл, илэрхийлэл

Энэ бүлэгт С++ хэл дэх төрлийн систем, түүнчлэн илэрхийлэл хэрхэн үнэлэгдэж, хувиргагддаг талаар гүнзгийрүүлэн авч үзэх болно.

Юуны түрүүнд цаашид хэрэглэгдэх зарим хэллэгүүдийн товч тодорхойлолтыг өгье.
Оператор гэдэг нь функцийн тусгай нэгэн төрөл бөгөөд өгөгдсөн операнд дээр тодорхой үйлдлийг гүйцэтгэж, үр дүнг нь буцаана. Операнд гэдэг нь аль нэг операторын аргумент юм.

Ерөнхийдөө оператор нь энгийн функц бөгөөд зарим тохиолдолд эдгээр функцийг инфикс үйлдлийн тэмдэгтэйгээр (+, -, *, / зэрэг) дуудаж болно гэж ойлгох нь зохимжтой. Өөрөөр хэлбэл функц дуудах урт бичлэгтэй синтаксийн (sum = operator+(a, b);) оронд уншихад илүү дөхөм инфикс синтаксыг (sum = a + b;) ашиглаж болно.

Илэрхийлэл нь нэг эсвэл олон тооны операнд болон фунцкуудээс тогтоно. Илэрхийлэл бүр тодорхой төрөл, мөн утгатай байна. Уг утга нь тухайн өгөгдсөн операнд дээр операторын тодорхойлолтод заасан үйлдлийг гүйцэтгэснээр гарч ирнэ.