6-bo‘lim

Operatorlar

Arifmetik, taqqoslash, mantiqiy va bit amallari, oshirish-kamaytirish, amallar ustuvorligi va qisqa tutashuv.

🕑 16 daqiqa o‘qish 📄 563 so‘z 👁 3 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Arifmetik operatorlar
  2. Qiymat berish operatorlari
  3. Oshirish va kamaytirish
  4. Taqqoslash operatorlari
  5. Mantiqiy operatorlar
  6. Qisqa tutashuv (short-circuit)
  7. Bit amallari
  8. Uchlik operator
  9. Amallar ustuvorligi
  10. Xulosa

Operator - qiymatlar ustida amal bajaradigan belgi. C da ular juda ko'p, lekin ularni guruhlab o'rgansak, hammasi tartibli ko'rinadi.

Arifmetik operatorlar #

OperatorAmalMisolNatija
+Qo'shish7 + 310
-Ayirish7 - 34
*Ko'paytirish7 * 321
/Bo'lish7 / 32
%Qoldiq7 % 31
C
#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;
}
Natija
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:

C
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.

Nolga bo'lish
C
int a = 5 / 0;    /* dastur qulaydi */

Butun sonni nolga bo'lish - aniqlanmagan xatti-harakat. Odatda dastur darhol to'xtaydi.

Bo'luvchini doim tekshiring:

C
if (bolvchi != 0) {
    natija = a / bolvchi;
}

Qiymat berish operatorlari #

C
#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;
}
Natija
+= 50 : 150
-= 30 : 120
*= 2  : 240
/= 4  : 60
%= 7  : 4

hisob += 50 - bu hisob = hisob + 50 ning qisqa yozuvi.

Oshirish va kamaytirish #

C
#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;
}
Natija
a++ qaytardi: 5, a endi = 6
++b qaytardi: 6, b endi = 6
++a va a++ farqi ++a (prefiks) 1. Avval oshiradi 2. Keyin qiymatni beradi a=5; b=++a; → a=6, b=6 a++ (postfiks) 1. Avval qiymatni beradi 2. Keyin oshiradi a=5; b=a++; → a=6, b=5
Yakuniy natija bir xil, lekin ifoda qaytaradigan qiymat boshqa
Bir ifodada ikki marta o'zgartirmang
C
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 #

OperatorMa'nosi
==Teng
!=Teng emas
<Kichik
>Katta
<=Kichik yoki teng
>=Katta yoki teng
C
#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;
}
Natija
yosh == 25 : 1
yosh != 25 : 0
yosh > 18  : 1
yosh < 18  : 0
C da 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:

C
#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 chalkashtirmang
C
if (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:

C
if (18 == yosh) { ... }   /* xato qilsangiz kompilyator to'xtatadi */

Mantiqiy operatorlar #

OperatorMa'nosiMisol
&&VA (ikkalasi ham)a > 0 && b > 0
||YOKI (kamida bittasi)a > 0 || b > 0
!EMAS (inkor)!faolmi
C
#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;
}
Natija
Qabul qilindi
Shartlar bajarildi
!0 = 1, !5 = 0

Qisqa tutashuv (short-circuit) #

C
#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;
}
Natija
&& bilan:
  birinchi tekshirildi
|| bilan:
  uchinchi tekshirildi
  kamida bittasi rost
Qisqa tutashuv - foydali xususiyat

&& da chap tomon yolg'on bo'lsa, o'ng tomon umuman hisoblanmaydi. || da chap tomon rost bo'lsa - xuddi shunday.

Bu xavfsizlik uchun ishlatiladi:

C
if (bolvchi != 0 && jami / bolvchi > 10) { ... }

Agar bolvchi nol bo'lsa, bo'lish umuman bajarilmaydi - dastur qulamaydi.

Ko'rsatkichlar bilan ham:

C
if (kursatkich != NULL && kursatkich->yosh > 18) { ... }

Bit amallari #

Bit darajasidagi amallar (8 bit uchun) a = 12 0 0 0 0 1 1 0 0 b = 10 0 0 0 0 1 0 1 0 a & b = 8 0 0 0 0 1 0 0 0 & - ikkalasida ham 1 bo'lsa | - kamida bittasida 1 bo'lsa ^ - faqat bittasida 1 bo'lsa ~ - hamma bitni teskari qiladi Surish amallari a << 1 → ikkiga ko'paytirish (12 → 24) a >> 1 → ikkiga bo'lish (12 → 6)
Bit amallari - eng tez amallardan biri
C
#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;
}
Natija
a & b  = 8
a | b  = 14
a ^ b  = 6
~a     = -13
a << 1 = 24
a >> 1 = 6
Bit amallari qayerda kerak?
  • Bayroqlar (flags) - bitta int da 32 ta ha/yo'q qiymat saqlash
  • Ruxsatlar - fayl huquqlari (rwx) shunday ishlaydi
  • Grafika - rang kanallarini ajratish
  • Optimallashtirish - x * 2 o'rniga x << 1

Bayroqlar bilan ishlash namunasi:

C
#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 #

C
#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;
}
Natija
Toifa: kattalar
Kattarogi: 42

shart ? rost_qiymat : yolgon_qiymat - bu if/else ning qisqa shakli.

Uchlik operatorni ichma-ich yozmang
C
/* 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 #

DarajaOperatorlarYo'nalish
1() [] -> .chapdan
2! ~ ++ -- - (tur) sizeofo'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
C
#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;
}
Natija
2 + 3 * 4     = 14
(2 + 3) * 4   = 20
10 - 4 - 3    = 3
1 + 2 > 2     = 1
Jadval yodlamang - qavs qo'ying

Ustuvorlik jadvalini yodlashning hojati yo'q. Shubha bo'lsa - qavs qo'ying:

C
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.

Amaliy topshiriq
  1. Ikkita sonni o'qib, beshta arifmetik amalni chiqaring.
  2. Sonning juft yoki toqligini % bilan aniqlang.
  3. a++ va ++a farqini o'z misolingizda ko'rsating.
  4. = o'rniga == yozib, kompilyator ogohlantirishini ko'ring.
  5. Qisqa tutashuvni funksiya chaqiruvi bilan isbotlang.
  6. Bayroqlar tizimini yozing: o'qish, yozish, bajarish huquqlari.
  7. x << 3 nechaga ko'paytirishini aniqlang.
  8. Uchta sondan eng kattasini uchlik operator bilan toping.
  9. 2 + 3 * 4 va (2 + 3) * 4 farqini tushuntiring.
  10. 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.
  • ++a avval 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.

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.