Bosh sahifa Wiki Operator precedence

Operator precedence

Operator precedence — qavslar bo‘lmagan ifodada qaysi operatorning operandlari avval guruhlanishini belgilaydigan til qoidasidir. Masalan, ko‘p tillarda ko‘paytirish qo‘shishdan yuqori precedencega ega bo‘lgani uchun 2 + 3 * 4 ifodasi 2 + (3 * 4) tarzida parse qilinadi. Precedence bajarilish vaqtini emas, avvalo sintaktik tuzilishni belgilaydi.

Associativity

Bir xil precedencega ega operatorlar ketma-ket kelganda associativity guruhlash yo‘nalishini belgilaydi. Left-associative ayirishda a - b - c ifodasi (a - b) - c bo‘ladi. Assignment ko‘p tillarda right-associative bo‘lib, a = b = 0 ifodasi a = (b = 0) tarzida talqin qilinadi.

Associative matematik amal bilan parser associativitysi bir xil tushuncha emas. Floating-point qo‘shish rounding sabab matematik jihatdan amalda associativ bo‘lmasligi mumkin, til parseri esa baribir chapdan guruhlaydi.

Precedence jadvali

Til spetsifikatsiyasi postfix, unary, multiplicative, additive, comparison, logical va assignment kabi qatlamlarni tartiblaydi. Aniq tartib tillar orasida farq qiladi. Bir tildagi odatni boshqasiga ko‘chirish xato: bitwise va equality operatorlarining nisbati ayniqsa nozik bo‘lishi mumkin.

Qavs precedence’ni aniq o‘zgartiradi. Murakkab ifodada qavs faqat compiler uchun emas, reviewer uchun ham niyatni ko‘rsatadi. Ortiqcha barcha subexpressionni qavsga olish esa matnni shovqinli qilishi mumkin; xavfli aralash operatorlarda aniqlik ustun turadi.

Parse treega ta’siri

Expression grammar precedence qatlamlari yoki parser generator deklaratsiyasi bilan yoziladi. a + b * c parse tree ildizida +, uning o‘ng childida * bo‘ladi. Compiler keyingi type checking va code generationni shu tree bo‘yicha bajaradi.

Overloaded operator precedence’ni odatda o‘zgartirmaydi. Masalan, user-defined + boshqa semantikaga ega bo‘lsa ham built-in + darajasida parse qilinadi. Ayrim tillar yangi infix operatorga precedence e’lon qilishga ruxsat beradi; librarylar o‘rtasidagi qoidalar readabilityni murakkablashtirishi mumkin.

Short-circuit va evaluation order

Precedence operandlar qanday guruhlanishini bildiradi, qaysi operand birinchi hisoblanishini doim belgilamaydi. f() + g() * h() tree tuzilishi aniq bo‘lsa ham function chaqiruv tartibi til spetsifikatsiyasiga bog‘liq. Side effect mavjud bo‘lsa evaluation order muhim.

Logical AND va OR ko‘p tillarda short-circuit qiladi: chap operand natijasi yetarli bo‘lsa o‘ng tomon bajarilmaydi. Bu precedence’dan alohida semantik qoida. obj != null && obj.ready xavfsizligi ANDning short-circuit xususiyatiga tayanadi.

Xatolarni kamaytirish

Linter assignmentni condition ichida, aralash && va ||ni yoki bit mask bilan equalityni qavssiz ishlatishni ogohlantirishi mumkin. Formatter spacing orqali operator guruhini ko‘rsatadi, lekin spacing semantikani o‘zgartirmaydi.

Code reviewda jadvalni yoddan taxmin qilish o‘rniga qavs yoki til spetsifikatsiyasi ishlatiladi. Security-critical conditionlar testlarda boundary va har branch bilan tekshiriladi, chunki noto‘g‘ri guruhlangan access check ruxsat bypassiga olib kelishi mumkin.

Domain-specific tillar

Query, template va configuration tillari ham precedence qoidasiga ega. SQL’da AND va ORni qavssiz aralashtirish filter doirasini kutilmaganda kengaytirishi mumkin. Search query yoki firewall policy’da bu data exposure yoki bypassga aylanadi.

Parser API expression tree’ni ko‘rsatishi mumkin; test expected AST bilan guruhlashni tekshiradi. Documentation jadval bilan birga real misol beradi. Yangi operator qo‘shilganda mavjud expressionlarning parse tree’si o‘zgarmasligi compatibility tekshiruvidan o‘tadi. Precedence darajasini release orasida o‘zgartirish source-level breaking change bo‘lib, formatter avtomatik qavs qo‘shadigan migratsiya vositasini talab qilishi mumkin.

Bog‘liq tushunchalar

Operator, Associativity, Expression, Parse tree, Evaluation order, Short-circuit evaluation, Grammar