1.4 —
Functions और return
values पर एक
नज़र
Function statements का एक ऐसा sequence
है जो
कोई विशेष कार्य करने के लिए design किया जाता है । आप पहले से ही
जानते हो की किसी program में main() function होना ज़रूरी है (क्यूंकि program
का execution
यहीं
से शुरू होता है) । आम तौर पर programs main() के अलावा भी कई functions
से बने
होते हैं ।
किसी Program को अकसर, किए जा रहे हालिया काम को छोड़
कर कोई दूसरा काम करने की ज़रूरत पड़ जाती है । आप भी दैनिक जीवन में ये हमेशा करते
हो । उदाहरण के लिए, मान लीजिये आपको किताब पढ़ते वक़्त याद आता है की आपको अपने दोस्त से
बात करनी है । आप अभी पढ़े जा रहे page पर एक चिन्ह लगाते हो (page के कोने को मोड़कर या इसके बीच
कुछ रखकर), मित्र को फ़ोन लगाते हो, और जब आपकी बात खत्म हो जाती
है, आप उस page से वापस पढ़ना शुरू करते हो
जिसे आपने चिन्हित किया था ।
C++ programs में भी कुछ ऐसा ही होता है । Program
किसी function
के
अंदर statements को sequentially (सिलसिलेवार क्रम में) execute
करता
है, जब तक इसे कोई function call statement ना मिल जाये । Function call एक तरह का expression
है जो CPU को अभी execute
हो रहे
function को बीच में ही छोडकर, called function को execute
करने
की आज्ञा देता है । CPU इसके बाद function
call होने
की जगह को “चिन्हित” करता है, और फिर दिए गए function
को call (execute) करता है । जब called
function का execution
पूरा
हो जाता है तो CPU वापस उसी जगह से execution की शुरुआत करता है जहाँ इसने
इससे पहले वाले function को चिन्हित किया था ।
यहाँ एक छोटा सा program दिया जा रहा है जो दर्शाता है
की नए functions किस तरह से define और call किये जातें हैं :
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//#include <stdafx.h> // Visual Studio users इसे uncomment करें
#include <iostream> // std::cout और std::endl के
लिए
// किसी
function
doPrint() का definition
void doPrint()
{
std::cout << "In doPrint()" << std::endl;
}
// function main() का definition
int main()
{
std::cout << "Starting main()" << std::endl;
doPrint(); // main() का execution रुका और doPrint() को call किया
गया
std::cout << "Ending main()" << std::endl;
return 0;
}
|
ये program निम्नलिखित output देता है:
Starting main()
In doPrint()
Ending main()
ये program (और C++ के सभी program)
function main() से execution की शुरुआत करता हैं, और पहले line को execute
करने
पर print होता है:
Starting main() । main()
function का
दूसरा line function doPrint() को call कर रहा है । यहाँ पर CPU,
main() का execution
रोक कर
doPrint() function में चला जाता है । doPrint में पहला (और आखरी) line In doPrint() print
करता
है । जब doPrint() का execution खत्म होता है, इसे call करने वाला function
(जो की main() है क्यूंकि doPrint()
को main के अन्दर से ही call किया गया था) वहीं से execution
की
शुरुआत करता है, जहां इसका execution बीच में रोका गया था ।
फलस्वरूप, main में अगला statement Ending main() print
करता
है ।
ध्यान दे की functions को उनके नाम और एक parameter
list जो parenthesis
( () ) में
बंद होता है, का इस्तेमाल करके call किया जाता है । हमारे उदाहरण
में, क्यूंकि हमारा function कोई parameter
इस्तेमाल
नहीं करता, इस list को खाली रखा गया है (देखिये, () बिलकुल खाली है) । अगले section
में हम
function parameters पर और अधिक चर्चा करेंगे । यदि आप parameter
list को भूल
जाते हो, तो function कभी भी call नहीं किया जा सकेगा!
Return values
यदि आपको याद हो, जब main()
function का execution
पूरा
होता है, ये operating system ( जो main को call करता है) को return
statement के
माध्यम से एक integer value return करता है ।
इसी प्रकार से आपका लिखा हर function अपने caller को एक single
value return कर सकता है । हमलोग function definition पर इसका एक return typeset करके कोई एक value
return कर
सकते हैं । return type एक data type है जो function
definition में function के नाम से पहले declare किया जाता है ।
void type के किसी return
type का
अर्थ है की वो function कोई भी value return नहीं कर सकता । int
type के एक return
type का
मतलब है की function इसके caller को एक integer
value return करेगा ।
|
1
2
3
4
5
6
7
8
9
10
11
|
// void का
मतलब है function अपने caller को
कुछ भी return नहीं करेगा
void returnNothing()
{
// ये function caller को कुछ return नहीं
करेगा, इसलिए कोई return statement नहीं
लिखा गया
}
// int का
मतलब है की function
caller को
एक integer value
return करेगा
int return5()
{
return 5; // ये function एक integer return करेगा, इसलिए
return statement लिखना ज़रूरी है
}
|
चलिए इन functions को किसी program
में use करते हैं:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include <iostream>
// void का
मतलब है function अपने caller को
कुछ भी return नहीं करेगा
void returnNothing()
{
// ये function caller को कुछ return नहीं
करेगा, इसलिए कोई return statement नहीं
लिखा गया
}
// int का
मतलब है की function
caller को
एक integer value
return करेगा
int return5()
{
return 5; // ये function एक integer return करेगा, इसलिए
return statement लिखना ज़रूरी है
}
int main()
{
std::cout << return5(); // prints 5
std::cout << return5() + 2; // prints 7
returnNothing(); // ठीक
है: function
returnNothing() को call किया
गया, जिसने कोई value return नही
किया
return5(); // ठीक
है: function
return5() को call किया
गया, return value का कोई इस्तेमाल नहीं हुआ
std::cout << returnNothing(); // ये line compile नहीं होगा । compile करने
के लिए इस line को comment out करना
पड़ेगा
return 0;
}
|
पहले function call में return5() execute हुआ । Call किये गये function
ने caller को 5
return किया
जिसे अंत में output operator की सहायता से cout के पास भेज दिया गया ।
दुसरे function call में,
return5() ने फिर
से caller main को 5 return किया । अब expression
कुछ इस
प्रकार का होगा: 5 + 2, जो evaluate होने पर 7 देगा । फिर value 7
को cout के पास भेज दिया जायेगा ।
तीसरे function call में,
returnNothing() execute किया गया । इस function में कुछ भी नहीं किया गया है
और ये main को कोई value भी return नहीं करता, इसलिए अब main() का execution
फिर resume हो जाता है ।
चौथे function call में return5() execute होकर main को value 5
return करता
है, लेकिन main इस value का कुछ नहीं करता । अर्थात, main न इस value को print करता है, न इसपे कोई mathematical
operation (जैसे जोड़, घटाव, गुणा या भाग) करता है, और ना ही इसे किसी variable
पर store करता है । इसलिए return
value को
बाहर कर दिया जाता है ।
5वें function call में returnNothing() void return करता है । C++ के अनुसार किसी void को cout के पास भेजना गलत है, इसलिए जब आप इस line को compile
करना
चाहोगे तो compiler आपको एक error देगा । आपको इस program
को compile
करने
के लिए 5वें function call statement को comment
out करना
होगा ।
ये सबसे ज्यादा पूछा जाने वाला सवाल है की, “क्या कोई function,
return statement का इस्तेमाल करके एक से अधिक values
return कर
सकता है?”. इसका सीधा जवाब जवाब “ना” है । कोई function
return statement के ज़रिये सिर्फ और सिर्फ एक ही value
return कर
सकता है । लेकिन function से एक से अधिक value return करने के कुछ उपाय हैं जिनकी
चर्चा हम तब करेंगे जब functions को गहरायी से जानेंगे ।
main को return करना
अब आप main() function के काम करने के तरीके को
जानने के लिए तैयार हो । जब कोई program execute होता है, आपका operating
system program के main() function को call करता है । इसके बाद main के सबसे पहले statement
से execution
की
शरुआत हो जाती है । main() के statements
sequentially (सिलसिलेवार ढंग से) execute होते हैं । Sequentially
execute होने
का मतलब है, सबसे पहला statement सबसे पहले execute
होगा, दूसरा पहले के बाद, तीसरा दुसरे के बाद…और इसी तरह आगे भी । अंत में, main
operating system को एक integer value (ज्यादातर 0)
return करता
है । इसी कारण से main को definition के समय
int main() लिखा जाता है ।
कुछ compilers main को
void main() लिखने की अनुमति भी देते हैं
। तकनिकी रूप से ये सही है । जब इन compilers को program
में void main()दिखायी देता है, वे इसे इस प्रकार बदल देते
हैं:|
1
2
3
4
5
|
int main()
{
// आपका
code
return 0;
}
|
आपको हमेसा main() को एक int
return करता
हुआ define करना चाहिए और इससे (main function से) हमेसा 0 ही return करना चाहिए (या यदि कहीं कोई
खराबी है तो कोई और integer) ।
अभी के लिए, आपको अपने program
का main()
function file में सबसे नीचे define करना चाहिए । हम थोड़ी ही देर
में इसका कारण पता लगायेंगे, section 1.7
-- Forward Declarations में ।
Functions का फिर से इस्तेमाल करना
किसी function को एक से अधिक बार भी call किया जा सकता है, जो तब उपयोगी साबित होगा जब
आपके program को एक ही काम बार-बार करने की ज़रूरत पड़ेगी ।
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//#include <stdafx.h> // Visual Studio users इसे uncomment करें
#include <iostream>
// getValueFromUser यूजर
से एक value लेगा और इसे caller के
पास भेज देगा (या caller को return कर
देगा)
int getValueFromUser()
{
std::cout << "Enter an integer: ";
int a;
std::cin >> a;
return a;
}
int main()
{
int x = getValueFromUser(); // getValueFromUser को
पहला call
int y = getValueFromUser(); // getValueFromUser को
दूसरा call
std::cout << x << " + " << y << " = " << x + y << std::endl;
return 0;
}
|
ये program निम्नलिखित output देगा:
Enter an integer: 5
Enter an integer: 7
5 + 7 = 12
यहाँ main() का execution दो बार रोका गया है,
getValueFromUser() के हर एक call पर । ध्यान दीजिये की दोनों
ही cases में, variable a का value जो user से लिया गया है, वो return
statement के
द्वारा main() के पास भेजा जाता है जहां main() इन values को x या y
variable में store कर लेता है ।
ध्यान दें की केवल main() ही ऐसा function
नहीं
है जो किसी दुसरे function को call कर सकता है । कोई भी function
किसी
दुसरे function को call कर सकता है!
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//#include <stdafx.h> // Visual Studio users इसे uncomment करें
#include <iostream>
void printA()
{
std::cout << "A" << std::endl;
}
void printB()
{
std::cout << "B" << std::endl;
}
// function printAB(), printA() और printB(), दोनों
functions को call करता
है
void printAB()
{
printA();
printB();
}
// main() का definition
int main()
{
std::cout << "Starting main()" << std::endl;
printAB();
std::cout << "Ending main()" << std::endl;
return 0;
}
|
ये program निम्नलिखित output देगा:
Starting main()
A
B
Ending main()
Nested functions
C++ में functions को किसी दुसरे function
के
अन्दर define नहीं किया जा सकता (इस क्रिया को nesting
कहा
जाता है)। नीचे दिया गया program सही नहीं है:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <iostream>
int main()
{
int foo() // ये function main() के अन्दर define किया
गया है जो गलत है
{
std::cout << "foo!";
return 0;
}
foo();
return 0;
}
|
ऊपर के program को सही ढंग से लिखने का तरीका
ये है:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <iostream>
int foo() // अब
ये main() के भीतर नहीं है
{
std::cout << "foo!";
return 0;
}
int main()
{
foo();
return 0;
}
|

No comments:
Post a Comment