6-bo‘lim
Operatorlar
Arifmetik, taqqoslash, mantiqiy va bit amallari, oshirish-kamaytirish, amallar ustuvorligi va qisqa tutashuv.
Ushbu bo‘lim mundarijasi
Operator - qiymatlar ustida amal bajaradigan belgi. C da ular juda ko'p, lekin ularni guruhlab o'rgansak, hammasi tartibli ko'rinadi.
Arifmetik operatorlar #
| Operator | Amal | Misol | Natija |
|---|---|---|---|
+ | Qo'shish | 7 + 3 | 10 |
- | Ayirish | 7 - 3 | 4 |
* | Ko'paytirish | 7 * 3 | 21 |
/ | Bo'lish | 7 / 3 | 2 |
% | Qoldiq | 7 % 3 | 1 |
#include <stdio.h>
int main(void) {
int a = 17, b = 5;
printf("%d + %d = %d\n", a, b, a + b);
printf("%d - %d = %d\n", a, b, a - b);
printf("%d * %d = %d\n", a, b, a * b);
printf("%d / %d = %d (butun bo'lish)\n", a, b, a / b);
printf("%d %% %d = %d (qoldiq)\n", a, b, a % b);
printf("Aniq bo'lish: %.4f\n", (double) a / b);
return 0;
}
17 + 5 = 22
17 - 5 = 12
17 * 5 = 85
17 / 5 = 3 (butun bo'lish)
17 % 5 = 2 (qoldiq)
Aniq bo'lish: 3.4000
% operatori nima uchun kerak?Qoldiq operatori juda ko'p ishlatiladi:
son % 2 == 0 /* juft sonmi? */
son % 3 == 0 /* 3 ga bo'linadimi? */
soniya % 60 /* daqiqadagi soniyalar */
indeks % massiv_hajmi /* aylanma indeks */
Diqqat: % faqat butun sonlar bilan ishlaydi. Haqiqiy sonlar uchun
math.h dagi fmod() funksiyasi bor.
int a = 5 / 0; /* dastur qulaydi */
Butun sonni nolga bo'lish - aniqlanmagan xatti-harakat. Odatda dastur darhol to'xtaydi.
Bo'luvchini doim tekshiring:
if (bolvchi != 0) {
natija = a / bolvchi;
}
Qiymat berish operatorlari #
#include <stdio.h>
int main(void) {
int hisob = 100;
hisob += 50; printf("+= 50 : %d\n", hisob);
hisob -= 30; printf("-= 30 : %d\n", hisob);
hisob *= 2; printf("*= 2 : %d\n", hisob);
hisob /= 4; printf("/= 4 : %d\n", hisob);
hisob %= 7; printf("%%= 7 : %d\n", hisob);
return 0;
}
+= 50 : 150
-= 30 : 120
*= 2 : 240
/= 4 : 60
%= 7 : 4
hisob += 50 - bu hisob = hisob + 50 ning qisqa yozuvi.
Oshirish va kamaytirish #
#include <stdio.h>
int main(void) {
int a = 5;
int natija_a = a++; /* avval qiymat beradi, keyin oshadi */
int b = 5;
int natija_b = ++b; /* avval oshadi, keyin qiymat beradi */
printf("a++ qaytardi: %d, a endi = %d\n", natija_a, a);
printf("++b qaytardi: %d, b endi = %d\n", natija_b, b);
return 0;
}
a++ qaytardi: 5, a endi = 6
++b qaytardi: 6, b endi = 6
int i = 5;
printf("%d\n", i++ + ++i); /* ANIQLANMAGAN XATTI-HARAKAT */
Bu kod turli kompilyatorlarda turli natija beradi. C standarti bunday holatda hech narsani kafolatlamaydi.
Qoida: bitta ifodada bitta o'zgaruvchini bir martadan ko'p o'zgartirmang.
Taqqoslash operatorlari #
| Operator | Ma'nosi |
|---|---|
== | Teng |
!= | Teng emas |
< | Kichik |
> | Katta |
<= | Kichik yoki teng |
>= | Katta yoki teng |
#include <stdio.h>
int main(void) {
int yosh = 25;
printf("yosh == 25 : %d\n", yosh == 25);
printf("yosh != 25 : %d\n", yosh != 25);
printf("yosh > 18 : %d\n", yosh > 18);
printf("yosh < 18 : %d\n", yosh < 18);
return 0;
}
yosh == 25 : 1
yosh != 25 : 0
yosh > 18 : 1
yosh < 18 : 0
bool turi qanday?C89 da mantiqiy tur umuman yo'q edi: 0 - yolg'on, nolga teng bo'lmagan har qanday son - rost.
C99 dan boshlab <stdbool.h> qo'shildi:
#include <stdbool.h>
bool faolmi = true;
if (faolmi) {
printf("Faol\n");
}
Ichkarida bu baribir butun son, lekin kod ancha o'qishli bo'ladi.
= va == ni chalkashtirmangif (yosh = 18) { /* XATO: qiymat beradi, taqqoslamaydi! */
printf("18 yosh\n");
}
Bu kod yosh ga 18 beradi, so'ng 18 ni «rost» deb qabul qiladi -
shart har doim bajariladi.
-Wall bayrog'i bu haqda ogohlantiradi. Ba'zi dasturchilar himoya uchun
doimiyni chapga yozadi:
if (18 == yosh) { ... } /* xato qilsangiz kompilyator to'xtatadi */
Mantiqiy operatorlar #
| Operator | Ma'nosi | Misol |
|---|---|---|
&& | VA (ikkalasi ham) | a > 0 && b > 0 |
|| | YOKI (kamida bittasi) | a > 0 || b > 0 |
! | EMAS (inkor) | !faolmi |
#include <stdio.h>
int main(void) {
int yosh = 25;
int bali = 85;
if (yosh >= 18 && bali >= 60) {
printf("Qabul qilindi\n");
}
if (yosh < 18 || bali < 60) {
printf("Qabul qilinmadi\n");
} else {
printf("Shartlar bajarildi\n");
}
printf("!0 = %d, !5 = %d\n", !0, !5);
return 0;
}
Qabul qilindi
Shartlar bajarildi
!0 = 1, !5 = 0
Qisqa tutashuv (short-circuit) #
#include <stdio.h>
int tekshir(const char *nom) {
printf(" %s tekshirildi\n", nom);
return 0;
}
int main(void) {
printf("&& bilan:\n");
if (tekshir("birinchi") && tekshir("ikkinchi")) {
printf(" ikkalasi rost\n");
}
printf("|| bilan:\n");
if (!tekshir("uchinchi") || tekshir("tortinchi")) {
printf(" kamida bittasi rost\n");
}
return 0;
}
&& bilan:
birinchi tekshirildi
|| bilan:
uchinchi tekshirildi
kamida bittasi rost
&& da chap tomon yolg'on bo'lsa, o'ng tomon umuman hisoblanmaydi.
|| da chap tomon rost bo'lsa - xuddi shunday.
Bu xavfsizlik uchun ishlatiladi:
if (bolvchi != 0 && jami / bolvchi > 10) { ... }
Agar bolvchi nol bo'lsa, bo'lish umuman bajarilmaydi - dastur
qulamaydi.
Ko'rsatkichlar bilan ham:
if (kursatkich != NULL && kursatkich->yosh > 18) { ... }
Bit amallari #
#include <stdio.h>
int main(void) {
int a = 12; /* 00001100 */
int b = 10; /* 00001010 */
printf("a & b = %d\n", a & b);
printf("a | b = %d\n", a | b);
printf("a ^ b = %d\n", a ^ b);
printf("~a = %d\n", ~a);
printf("a << 1 = %d\n", a << 1);
printf("a >> 1 = %d\n", a >> 1);
return 0;
}
a & b = 8
a | b = 14
a ^ b = 6
~a = -13
a << 1 = 24
a >> 1 = 6
- Bayroqlar (flags) - bitta
intda 32 ta ha/yo'q qiymat saqlash - Ruxsatlar - fayl huquqlari (
rwx) shunday ishlaydi - Grafika - rang kanallarini ajratish
- Optimallashtirish -
x * 2o'rnigax << 1
Bayroqlar bilan ishlash namunasi:
#define OQISH 1 /* 001 */
#define YOZISH 2 /* 010 */
#define BAJARISH 4 /* 100 */
int huquq = OQISH | YOZISH; /* ikkisini qo'shamiz */
if (huquq & YOZISH) { /* yozish huquqi bormi? */
printf("Yozish mumkin\n");
}
huquq &= ~YOZISH; /* yozish huquqini olib tashlaymiz */
Uchlik operator #
#include <stdio.h>
int main(void) {
int yosh = 25;
const char *holat = (yosh >= 18) ? "kattalar" : "bolalar";
printf("Toifa: %s\n", holat);
int a = 17, b = 42;
int kattarog = (a > b) ? a : b;
printf("Kattarogi: %d\n", kattarog);
return 0;
}
Toifa: kattalar
Kattarogi: 42
shart ? rost_qiymat : yolgon_qiymat - bu if/else ning qisqa shakli.
/* O'qib bo'lmaydi */
char *daraja = (b >= 90) ? "A" : (b >= 80) ? "B" : (b >= 70) ? "C" : "F";
Ikki holatdan ko'p bo'lsa, oddiy if/else if yozing - u ancha aniqroq.
Amallar ustuvorligi #
| Daraja | Operatorlar | Yo'nalish |
|---|---|---|
| 1 | () [] -> . | chapdan |
| 2 | ! ~ ++ -- - (tur) sizeof | o'ngdan |
| 3 | * / % | chapdan |
| 4 | + - | chapdan |
| 5 | << >> | chapdan |
| 6 | < <= > >= | chapdan |
| 7 | == != | chapdan |
| 8 | & | chapdan |
| 9 | ^ | chapdan |
| 10 | | | chapdan |
| 11 | && | chapdan |
| 12 | || | chapdan |
| 13 | ?: | o'ngdan |
| 14 | = += -= ... | o'ngdan |
#include <stdio.h>
int main(void) {
printf("2 + 3 * 4 = %d\n", 2 + 3 * 4);
printf("(2 + 3) * 4 = %d\n", (2 + 3) * 4);
printf("10 - 4 - 3 = %d\n", 10 - 4 - 3);
printf("1 + 2 > 2 = %d\n", 1 + 2 > 2);
return 0;
}
2 + 3 * 4 = 14
(2 + 3) * 4 = 20
10 - 4 - 3 = 3
1 + 2 > 2 = 1
Ustuvorlik jadvalini yodlashning hojati yo'q. Shubha bo'lsa - qavs qo'ying:
if ((a & MASKA) == 0) { ... } /* to'g'ri */
if (a & MASKA == 0) { ... } /* xato: == avval bajariladi! */
Ikkinchi qatorda MASKA == 0 avval hisoblanadi - bu deyarli har doim
xato. Qavs bepul va kodni aniq qiladi.
- Ikkita sonni o'qib, beshta arifmetik amalni chiqaring.
- Sonning juft yoki toqligini
%bilan aniqlang. a++va++afarqini o'z misolingizda ko'rsating.=o'rniga==yozib, kompilyator ogohlantirishini ko'ring.- Qisqa tutashuvni funksiya chaqiruvi bilan isbotlang.
- Bayroqlar tizimini yozing: o'qish, yozish, bajarish huquqlari.
x << 3nechaga ko'paytirishini aniqlang.- Uchta sondan eng kattasini uchlik operator bilan toping.
2 + 3 * 4va(2 + 3) * 4farqini tushuntiring.- Soniyani soat, daqiqa va soniyaga ajrating (
/va%bilan).
Xulosa #
- Butun sonlarni bo'lish kasr qismini tashlaydi:
17 / 5 == 3. %qoldiq beradi va faqat butun sonlar bilan ishlaydi.- Nolga bo'lishni doim oldindan tekshiring.
++aavval oshiradi,a++avval qiymat beradi.- Bir ifodada bitta o'zgaruvchini ikki marta o'zgartirmang.
- C da 0 - yolg'on, nolga teng bo'lmagan hamma narsa - rost.
=(qiymat berish) va==(taqqoslash) ni chalkashtirmang.&&va||qisqa tutashadi - bu xavfsizlik uchun juda foydali.- Bit amallari bayroqlar va optimallashtirish uchun ishlatiladi.
- Ustuvorlik jadvalini yodlamang - qavs qo'ying.
Keyingi bo'limda shart operatorlarini - if, else va switch ni
ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.