5.1.6 · Coding › C Programming
Ek program instructions ki list hoti hai. By default CPU unhe upar se neeche, ek ke baad ek execute karta hai. Control flow statements sirf wahi cheez hai jo us seedhi line ko tod sakti hai: yeh tumhe choose karne deti hai (kaunsa path lena hai), repeat karne deti hai (loop), aur jump karne deti hai (aage/peeche skip karna). Har algorithm jo tum kabhi bhi likho ge woh sirf teen powers se bani hoti hai: sequence, selection, aur iteration .
Branching ke bina, ek program sirf ek fixed cheez hamesha ke liye kar sakta tha. Real problems mein decisions chahiye hote hain ("agar user logged in hai...") aur repetition ("list ke har item ke liye..."). Computer isliye fast hota hai kyunki woh ek tiny instruction billions of times repeat kar sakta hai — lekin us baat ko compactly express karne ke liye tumhe ek loop chahiye hota hai, warna woh line billion baar likhni padti.
Ek if statement ek block tab hi chalati hai jab condition true ho . C mein, ek condition "true" hoti hai jab uski value non-zero ho, aur "false" hoti hai jab woh exactly 0 ho. Koi alag boolean type required nahi hai (halaanki _Bool/<stdbool.h> exist karta hai).
if (condition) {
// runs when condition != 0
} else if (other) {
// runs when other != 0
} else {
// fallback
}
Worked example Ek number ko classify karo
int n = - 3 ;
if (n > 0 ) printf ( "positive" );
else if (n == 0 ) printf ( "zero" );
else printf ( "negative" ); // prints this
Yeh step kyun? Conditions order mein, upar se neeche check hoti hain; pehli true condition jeet jaati hai aur baaki skip ho jaati hain. Kyunki n>0 false hai aur n==0 false hai, hum else tak pahunch jaate hain.
= vs ==
if (x = 5) likhna sahi lagta hai kyunki math mein = ka matlab equality hota hai. Lekin C mein, = assignment hai: x = 5 x mein 5 store karta hai aur expression ki value 5 hoti hai (non-zero → hamesha true!). Fix yeh hai: comparison ke liye == use karo. Trick: if (5 == x) likho taaki ek typo 5 = x compiler error ban jaaye.
switch bahut saare cases mein se select karta hai ek integer (ya char) expression ko constant case labels se compare karke. Execution matching label par jump karti hai aur phir fall through hoti rehti hai agle statements mein jab tak break (ya end) na aa jaaye.
switch (expr) {
case 1 : /* ... */ break ;
case 2 : /* ... */ break ;
default : /* none matched */
}
Intuition Fall-through kyun?
switch actually ek block mein ek computed jump hai, alag-alag boxes ka set nahi. Jab tum ek label par land karte ho, code neeche ki taraf chalata rehta hai. Isliye tumhe rokne ke liye break chahiye — warna tum agle case mein "fall through" kar jaate ho. Yeh kabhi-kabhi useful hota hai (cases group karna) lekin aksar bug ka source bhi hai.
Worked example Cases ko deliberately group karna
switch (grade) {
case 'A' :
case 'B' : printf ( "Pass with distinction" ); break ;
case 'C' : printf ( "Pass" ); break ;
default : printf ( "Fail" );
}
Yeh step kyun? 'A' mein koi break nahi hai, isliye woh deliberately 'B' ke code mein fall through karta hai — dono ek hi message print karte hain.
Common mistake break bhool jaana
break chhodna theek lagta hai agar tum sochte ho ki har case ek if ki tarah isolated hai. Fix: har case mein break add karo jab tak tum deliberately fall-through intend na karo (aur use comment karo: /* fall through */).
Intuition Har loop ki anatomy
Har loop ke 4 parts hote hain: (1) initialization (ek counter set up karo), (2) condition (kab chalate rehna hai), (3) body (kaam), (4) update (rokne ki taraf move karo). Agar condition kabhi false nahi hoti, tum ek infinite loop mein pad jaate ho.
Har pass se pehle condition check karta hai. Agar shuru mein hi false ho, toh body zero baar chalti hai.
int i = 0 ; // 1 init
while (i < 3 ) { // 2 condition (checked first)
printf ( " %d " , i); // 3 body
i ++ ; // 4 update
} // prints: 0 1 2
Body ko pehle ek baar chalata hai, phir condition check karta hai. Kam se kam ek execution guarantee karta hai. while(...) ke baad required semicolon note karo.
int i = 5 ;
do {
printf ( " %d " , i); // prints 5 once even though 5<3 is false
i ++ ;
} while (i < 3 );
Intuition do-while kab jeetta hai
Ise tab use karo jab "pehle karo, phir repeat karne ke baare mein pucho": menus, input validation ("ek number maango, phir agar woh invalid tha toh maangna jaari rakho").
Init, condition, aur update sab ko ek header mein pack karta hai. Ek while ke equivalent hai jisme update built in ho.
for ( int i = 0 ; i < 3 ; i ++ ) {
printf ( " %d " , i);
}
Definition break / continue
break innermost loop ya switch se turant exit karta hai.
continue current iteration ka baaki hissa skip karta hai aur loop ke update/condition par jump karta hai.
Worked example break vs continue
for ( int i = 0 ; i < 5 ; i ++ ) {
if (i == 2 ) continue ; // skip printing 2
if (i == 4 ) break ; // stop entirely before 4
printf ( " %d " , i);
} // prints: 0 1 3
Yeh step kyun? i==2 par, continue i++ par jump karta hai (isliye 2 kabhi print nahi hota). i==4 par, break loop se bahar nikal jaata hai, isliye 4 bhi print nahi hota — aur hum 3 pichli iteration mein already print kar chuke hain.
Common mistake continue in for vs while
Log assume karte hain ki continue hamesha same behave karta hai. Ek for loop mein, continue phir bhi update i++ run karta hai. Lekin agar tum manually ek for ko while mein translate karo aur manual i++ se pehle continue rakho, toh tum increment skip kar lete ho → infinite loop! Fix: while mein, kisi bhi continue se pehle update karo, ya restructure karo.
goto label; unconditionally usi function mein ek label: par jump karta hai. Powerful lekin dangerous ("spaghetti code"). Iska ek widely-accepted use hai nested loops se bahar nikalna ya C mein centralized cleanup/error handling .
Worked example Sahi goto — nested loops todna
for ( int i = 0 ; i < N; i ++ )
for ( int j = 0 ; j < M; j ++ )
if ( grid [i][j] == target)
goto found; // break only exits inner loop; goto escapes both
found:
printf ( "done" );
Yeh step kyun? Ek akela break sirf inner j loop se exit karta hai. goto dono se ek saath clean bahar nikal jaata hai.
Common mistake goto har jagah
Goto convenient lagta hai kyunki yeh ek direct jump hai. Lekin unrestricted jumps code ko follow karna impossible bana dete hain. Fix: loops + functions prefer karo; goto ko sirf nested-loop exits aur error cleanup ke liye reserve karo.
S equence, S election, I teration yeh 3 building blocks hain. Jump trio hai BCG : B reak (niklo), C ontinue (aage skip karo), G oto (teleport karo). Aur yaad rakho do-while = "pehle karo, baad mein pucho."
Recall Ek 12-saal ke bachche ko samjhao
Socho tum ek recipe follow kar rahe ho. if/else = "agar dough sticky hai, toh flour daalo; warna bake karo." switch = ek vending machine: ek button dabaao (A1, A2...) aur tum seedha us snack par pahunch jaate ho. while = "jab tak gaaanth hai tab tak chalate raho hilaana." do-while = "ek baar hilao, phir agar abhi bhi gaaanth hai toh hilate raho." for = "exactly 10 baar hilao." break = "ABHI hilana band karo." continue = "yeh ek hilana skip karo aur agle par jao." goto = ek magic trapdoor jo tumhe recipe mein kisi aur marked jagah teleport kar deta hai — kabhi-kabhi kaam aata hai, aksar confusing hota hai.
C mein, ek condition "true" kab hoti hai? Jab uski value koi bhi non-zero ho (false sirf tab hoti hai jab exactly 0 ho).
if (x = 5) actually kya karta hai?x mein 5 assign karta hai; expression ki value 5 hoti hai (non-zero) → hamesha true. Bug.
switch mein har case mein break kyun chahiye?Execution agle case ke code mein fall through hoti rehti hai jab tak break ya block end na aaye.
switch expression kya ho sakta hai?Ek integer ya char (integral) type jo constant case labels se compare hota hai.
while aur do-while mein kya fark hai?while pehle test karta hai (0 baar chal sakta hai); do-while baad mein test karta hai (kam se kam ek baar chalta hai).
for≡while equivalence do. for(A;B;C){S} ≡ A; while(B){ S; C; }
break kya karta hai?Innermost enclosing loop ya switch se turant exit karta hai.
continue kya karta hai?Current iteration ka baaki hissa skip karta hai aur loop ke update/condition test par jaata hai.
Hand-written while loop mein continue infinite loops kyun cause kar sakta hai? Yeh increment statement ko skip kar sakta hai agar update continue ke baad rakha ho.
C mein goto ka main legitimate use kya hai? Deeply nested loops se bahar nikalna ya centralized error/cleanup handling.
Do nested loops ke andar break kya karta hai? Sirf innermost loop se exit karta hai, dono se nahi.
for(i=0;i<5;i++){if(i==2)continue; if(i==4)break; printf("%d",i);} ka output kya hai?0 1 3
C Operators — ==, =, &&, ||, ! woh conditions produce karte hain jo branches test karti hain.
Loops and Time Complexity — nested loops → O ( n 2 ) etc.
Functions in C — return ek aur control-flow jump hai; goto function-local hai.
Boolean Logic — conditions mein &&/|| ki short-circuit evaluation.
Recursion — repetition ke liye iteration ka ek alternative.