5.1.4 · Coding › C Programming
Ek operator ek chhoti si machine hai: isko operands (values) do, aur ek result wapas milta hai.
Poora C arithmetic teen cheezein jaanne pe aata hai — har operator kya return karta hai , us result ki kya type hoti hai, aur kis order mein operators chalte hain. In teen sawaalon ko samajh lo toh almost har "weird bug" operators ke saath gayab ho jaata hai.
Definition Operator vs operand
Ek operator woh symbol hota hai jo koi operation perform karta hai (+, &&, >>, =).
Ek operand woh value hoti hai jis par operator kaam karta hai. 3 + 4 mein operator + hai, operands 3 aur 4 hain.
Operands ki ginti = operator ki arity : unary (1), binary (2), ternary (3, sirf ?:).
Hum operators ko group karte hain kyunki har group ki apni return type aur precedence rules hoti hain. Groups ko blindly mix karna (jaise a & b == c) bugs ka #1 source hai.
+ - * / % (binary) aur unary +, -. Plus ++ aur -- (increment/decrement).
/ aur % special kyun hain
Integers ke liye, / truncating division karta hai (fraction ko throw kar deta hai, zero ki taraf) aur % remainder return karta hai. Yeh dono neeche wali identity se jude hain.
% ki signs
-7 / 2 → -3 (-3.5 ko zero ki taraf truncate karo).
Yeh step kyun? C99 zero ki taraf truncate karta hai, − ∞ ki taraf nahi.
-7 % 2 = -7 - (-3)*2 = -7 + 6 = -1.
Yeh step kyun? Identity use karo; result ki sign -7 ki hoti hai.
Worked example Worked: integer vs float
/
5 / 2 → 2 (dono operands int hain → integer division).
5 / 2.0 → 2.5 (ek operand double hai → promote karo, real division hogi).
Yeh step kyun? / operand ki types dekh ke kaam karta hai, aapki expectation se nahi.
Common mistake Steel-man: "5/2 should be 2.5"
Kyun sahi lagta hai: math class mein 5/2 = 2.5 hota hai.
Bug: C mein dono operands int hain, isliye C integer division karta hai → 2.
Fix: ek operand floating banao: 5 / 2.0, ya cast karo: (double)5 / 2.
Dhyan raho (double)(5/2) fir bhi 2.0 hai — aap cast baad mein karte ho jab integer division already fraction destroy kar chuka hota hai.
Relational: < > <= >=. Equality: == !=.
Yeh kya return karte hain: ek int jo 1 (true) ya 0 (false) hota hai. Classic C mein koi Boolean type nahi hoti — true bas "nonzero" hota hai.
(3 < 5) evaluate hoke 1 banta hai. (3 == 5) evaluate hoke 0 banta hai.
Toh printf("%d", 4 > 2); 1 print karega.
Common mistake Steel-man:
if (x = 5)
Kyun sahi lagta hai: tumhara matlab tha "agar x 5 ke barabar hai".
Bug: = assignment hai; yeh x mein 5 store karta hai aur expression ki value 5 hoti hai (nonzero → hamesha true).
Fix: == use karo. Defensive trick: if (5 == x) likho taaki typo 5 = x compile hi na ho.
&& (AND), || (OR), ! (NOT). Operands ko truth values ki tarah treat kiya jaata hai (0 = false, nonzero = true). Result 1 ya 0 hota hai.
Intuition Short-circuit evaluation — killer feature
A && B: agar A false (0) hai, toh answer already false hai → B kabhi evaluate nahi hota .
A || B: agar A true hai, toh answer already true hai → B kabhi evaluate nahi hota .
WHY: logic ek baar decide hone ke baad change nahi ho sakti, isliye C kaam bachata hai — aur tum dangerous code ko guard kar sakte ho.
Worked example Short-circuit se guarding
if (p != NULL && p->value > 0)
Yeh step kyun? Agar p NULL hai toh left side false hai, isliye p->value (jo crash karega!) kabhi touch nahi hoti. Order matter karta hai.
& AND, | OR, ^ XOR, ~ NOT (complement), << left shift, >> right shift.
Yeh integers ke individual bits par kaam karte hain, truth values par nahi.
Worked example Worked bit-by-bit (8-bit view)
12 & 10: 12 = 0000 1100, 10 = 0000 1010. Har column ka AND karo → 0000 1000 = 8.
12 | 10 → 0000 1110 = 14. 12 ^ 10 → 0000 0110 = 6.
Yeh step kyun? AND woh bits rakhta hai jo dono mein common hain; XOR woh bits rakhta hai jo alag hain.
Worked example Shift as arithmetic
5 << 2 = 5 * 4 = 20. 20 >> 1 = 20 / 2 = 10.
Yeh step kyun? Har left shift double karta hai; har right shift halve karta hai (floor).
Common mistake Steel-man:
if (a & b == c) likhna
Kyun sahi lagta hai: tum isse left-to-right padhte ho "(a&b) ko c se compare karo".
Bug: == ki precedence & se zyada hai, isliye C isse a & (b == c) padhta hai.
Fix: parenthesize karo: if ((a & b) == c).
Simple = aur compound: += -= *= /= %= &= |= ^= <<= >>=.
x += y x = x + y ka shorthand hai. Assignment right-associative hoti hai aur poore expression ki ek value hoti hai (jo value store ki gayi).
Intuition Compound forms kyun exist karte hain
Brevity aur clarity. 2. x ek baar evaluate hota hai — arr[f()] += 1 mein matter karta hai jahan f() sirf ek baar chalna chahiye.
Worked example Assignment chains aur value
a = b = c = 0; → kyunki = right-associative hai, yeh a = (b = (c = 0)) hai. Sab zero ho jaate hain.
Yeh step kyun? Har = assigned value return karta hai, jo baai taraf wale agle = ko feed hoti hai.
Comma operator a, b pehle a evaluate karta hai (aur usse discard kar deta hai), phir b evaluate karta hai; poore expression ki value b hoti hai (last wala). Yeh ek sequence point bhi introduce karta hai — a poora finish hota hai b se pehle.
x = (1, 2, 3); → x 3 ban jaata hai.
Classic use for loop mein: for (i = 0, j = n; i < j; i++, j--).
Yeh step kyun? Comma do updates run karne deta hai jahan C ek expression expect karta hai.
Common mistake Steel-man: function calls mein comma
Kyun sahi lagta hai: f(a, b) mein commas hain, toh tumhe lagta hai yeh comma operator hai.
Bug/fix: woh argument separators hain, comma operator NAHI. Ek argument ki tarah comma expression pass karne ke liye parenthesize karo: f((a, b)).
Recall Feynman: 12 saal ke bacche ko samjhao
Operators chhote kitchen tools ki tarah hain. + ek mixer hai jo add karta hai, % woh tool hai jo pizza equally share karne ke baad bacha hua slice deta hai. && ek strict bouncer hai: dono conditions true honi chahiye andar aane ke liye, aur agar pehla banda fail karta hai, toh woh doosre ko check bhi nahi karta. Bit operators numbers ko light switches ki row ki tarah dekhte hain aur unhein flip karte hain. Aur ek "baithne ka order" (precedence) hota hai — kuch tools hamesha pehle jaate hain; agar order pasand na ho, brackets mein wrap karo apna order force karne ke liye.
Mnemonic Precedence yaad rakhne ke liye
"Please Eat My Awesome Red Cake Before Lunch, Comma!"
P arens → E xponent-like unary → M ul/mod → A dd → (shift) → R elational → (equality) → bitwise → logical → assign → Comma last .
Aur short-circuit ke liye: "AND pehle FALSE par quit karta hai, OR pehle TRUE par quit karta hai."
C99 mein integer expression -7 % 2 kya evaluate hota hai, aur kyun? -1; % dividend ki sign leta hai kyunki / zero ki taraf truncate karta hai: -7 - (-3)*2 = -1.
(3 < 5) jaisa relational expression value/type ki tarah kya return karta hai?Ek int jo 1 (true) ya 0 (false) ke barabar hota hai.
if (x = 5) hamesha true kyun hota hai?= assignment hai; yeh x mein 5 store karta hai aur expression ki value 5 hoti hai (nonzero), isliye condition true hoti hai. == use karo.
&& aur || ki short-circuit evaluation kya hoti hai?&& ruk jaata hai agar left side false hai; || ruk jaata hai agar left side true hai — right operand evaluate nahi hota.
5 << 2 kya equal hota hai aur kyun?20, kyunki left shift by n, 2^n se multiply karta hai (5 × 4).
12 & 10 bit by bit compute karo.0000 1100 & 0000 1010 = 0000 1000 = 8.
if (a & b == c) galat kyun behave karta hai?== ki precedence & se zyada hoti hai, isliye yeh a & (b == c) parse hota hai. Fix karo (a & b) == c se.
x = (1, 2, 3); x ko kya set karta hai, aur kyun?3; comma operator har operand ko left to right evaluate karta hai aur last wala yield karta hai.
f(a, b) mein comma, comma operator hai?Nahi, yeh ek argument separator hai. Comma expression pass karne ke liye f((a, b)) use karo.
5 / 2 2 deta hai lekin 5 / 2.0 2.5 kyun deta hai?Dono int → integer (truncating) division; ek operand ko double banana real division ke liye promote karta hai.
C kaunsi division–remainder identity guarantee karta hai? a == (a/b)*b + (a%b).
a = b = c = 0; kya karta hai aur kyun?Sab ko 0 set karta hai; = right-associative hota hai aur har = apni assigned value return karta hai.
Arity unary/binary/ternary
Truncating division toward zero
Remainder sign of dividend
if x=5 assigns not compares