C ++ में फ़ंक्शन घोषणा के बाद अर्धविराम ('?') की आवश्यकता नहीं है?


174

मैंने अभी हाल ही में एक इंटरमीडिएट प्रोग्रामिंग टेस्ट लिया था, और मेरे द्वारा गलत किया गया एक प्रश्न इस प्रकार था:

एक फ़ंक्शन घोषणा के बाद एक अर्धविराम (';') की आवश्यकता नहीं है।

सही या गलत।

मैंने "झूठा" चुना (और कृपया मुझे सही करें अगर मैं गलत हूं क्योंकि मुझे लगता है कि मैं पागल हो रहा हूं), एक फ़ंक्शन घोषणा है जिसे आप परिभाषा से पहले लिखते हैं (कोड के शीर्ष पर) इसलिए संकलक फ़ंक्शन को जानता है। इसे कॉल करने से पहले कॉल करें, और एक फंक्शन डेफिनिशन है जो फंक्शन को संपूर्ण बनाता है।

अर्थात,

घोषणा:

int func();

परिभाषा:

int func() {
  return 1;
}

क्या इसका उत्तर गलत नहीं होना चाहिए?


41
एक परिभाषा भी एक घोषणा है। लेकिन मैं कहूंगा कि आपका उत्तर सही था।

216
यह एक मुश्किल नाइटपैकिंग प्रश्न है और किसी की भी अच्छी तरह से प्रोग्राम करने की क्षमता पर कोई असर नहीं पड़ता है।
फोनटैगर

40
मुझे हमेशा सवाल मिलते हैं, इसका परिणाम दोहरा-नकारात्मक होता है, भ्रामक। मेरे दिमाग में, ऐसे प्रश्न छात्रों को यात्रा करने के लिए डिज़ाइन किए जाते हैं। प्रश्न निम्नलिखित तरीके से क्यों नहीं बनाया जा सकता है: "एक अर्धविराम ('?') हमेशा एक फ़ंक्शन घोषणा के बाद आवश्यक है। यह सच है या गलत है।" : /
अल्जीरडास प्रीजियस

18
@phonetagger यह सब भ्रम यह दिखाने के लिए जाता है कि प्रश्न कितना बुरा है।
फ्रांस्वा एंड्रीक्स

34
हैलन के रेजर का सुझाव है कि परीक्षण के लेखक ने "घोषणा" और "परिभाषा" को मिलाया।
स्नेफेल

जवाबों:


161

आपके पास ऐसी स्थिति हो सकती है जहां आप फ़ंक्शन को एक चरण में घोषित करते हैं और परिभाषित करते हैं, अर्थात यदि आप उस बिंदु पर फ़ंक्शन परिभाषा को शामिल करते हैं जहां आप इसे घोषित कर रहे हैं। इसलिए तकनीकी तौर पर मुझे लगता है कि यह सही है। लेकिन सवाल इस तरह से किया गया है कि मैंने इसका जवाब उसी तरह दिया होगा जैसे आपने किया था।


10
मेरा तर्क है कि आपके द्वारा दिए गए कारण से सत्य सही नहीं है। यदि ऐसे मामले हैं जब अर्धविराम की आवश्यकता होती है, तो यह गलत है (या सच नहीं है)। सच्चा मेरे लिए सबसे अच्छा है, अगर स्पष्ट मामले हैं जब इसकी आवश्यकता होती है तो आप सच नहीं कह सकते।
मैं फिकबॉल

16
@IFunball अच्छा तर्क। मूर्खतापूर्ण नट भाषा। एक फ़ंक्शन घोषणा के बाद "ए अर्धविराम (';') की आवश्यकता नहीं है" के रूप में पढ़ा जा सकता है "एक अर्धविराम (';') एक समारोह घोषणा के बाद (कभी भी) की आवश्यकता नहीं है " या एक अर्धविराम (') के रूप में; ) एक फ़ंक्शन घोषणा के बाद (हमेशा) आवश्यक नहीं है "। चाहे व्याख्या को चुनने पर कथन को सही या गलत माना जाए। कड़ाई से बोला गया सवाल अस्पष्ट है और इसलिए इसका कोई स्पष्ट जवाब नहीं है।
पीटर - मोनिका

6
@ लाइफबॉल यह इसलिए है क्योंकि "घोषणा", कोई और संदर्भ नहीं है और कोई बयान नहीं है कि हम भाषा के नियम हैं, आमतौर पर "गैर-परिभाषित घोषणा" का मतलब समझा जाता है। सवाल अनुचित था।
ऑर्बिट में लाइटनेस दौड़

2
कोई भी परीक्षा प्रश्न जो किसी ऐसे व्यक्ति के लिए अस्पष्ट है जो जानता है कि जिस सामग्री के लिए परीक्षण किया जा रहा है, वह है
नेट

2
लगता है जैसे हमें अंग्रेजी भाषा में एक अपरिभाषित व्यवहार खंड जोड़ने की जरूरत है
निक मेर्टिन

147

"एक परिभाषा भी एक घोषणा है" बात के अलावा, निम्नलिखित कानूनी C ++ है:

int f(), g();

यह दो कार्यों की घोषणा करता है, fऔर g, दोनों बिना तर्क और वापसी के प्रकार के साथ int, लेकिन fअर्धविराम द्वारा (तुरंत) की परिभाषा का पालन ​​नहीं किया जाता है। इसी तरह, यह कानूनी है:

int f(), i = 42;

लेकिन यह वास्तव में इन मामलों में अर्धविराम को पूरी तरह से छोड़ने की अनुमति नहीं है, इसलिए यह कुछ आश्चर्यजनक होगा यदि या तो निम्नलिखित अर्धविराम के बिना एक घोषणा के उदाहरण के रूप में लिया गया था। वास्तव में, निम्नलिखित अवैध है:

void *p, f() {}

एक (मात्र) फ़ंक्शन घोषणा के अलावा, एक फ़ंक्शन परिभाषा को किसी भी अन्य घोषणा या परिभाषा के साथ एक ही प्रकार-विनिर्देशक के साथ जोड़ा नहीं जा सकता है । (यदि यह कानूनी थे, तो यह ए void *pऔर ए दोनों को परिभाषित करेगा void f() {}।)

किसी भी मामले में, यह एक "गेटा" प्रकार का प्रश्न प्रतीत होता है जो कि एक मध्यवर्ती प्रोग्रामिंग परीक्षण में नहीं होना चाहिए।

(ओह, वैसे, कृपया कोड को वास्तव में पसंद न करें int f(), i = 42;।)


2
किसी फ़ंक्शन प्रकार को परिभाषित करने के लिए एक टाइप-सीड का उपयोग करना भी संभव है, और फिर एक ही बार में कई फ़ंक्शन घोषित करने के लिए इसका उपयोग करें, उदाहरण के लिए typedef int fooProc(int); fooProc a,b.c.d.e;मुझे यकीन नहीं है कि फ्लॉपी-ड्राइव-आधारित संकलक के लिए मानक हेडर ने ऐसा क्यों नहीं किया। दिन, क्योंकि मुझे लगता है कि यह हेडर फ़ाइलों को काफी छोटा करने की अनुमति देता है और इस तरह से तेजी से संसाधित होता है।
सुपरकैट

यह भी विचार करें कि int f(int(&g)(),int(*h)()){return g()+h();}इसमें तीन फ़ंक्शन घोषणाएं हैं, जिनमें से एक खुले घुंघराले ब्रेस द्वारा पीछा किया जाता है, दूसरा अल्पविराम द्वारा और तीसरा एक करीबी कोष्ठक द्वारा।
डेविड हैमेन

1
@David Hammen: इसके अलावा कड़ाई से अन्य कार्यों की घोषणा नहीं करता है int f(stuff)। फ़ंक्शन के दायरे में भी, फ़ंक्शन के संदर्भg का एक स्वचालित चर है , और कार्य करने के लिए एक सूचक हैh
पीटर कॉर्ड्स

83

अन्य उत्तर और टिप्पणियाँ कई तरह से बताते हैं कि यह एक भयावह, भ्रामक और बुरी तरह से लिखित प्रश्न है। लेकिन एक और समस्या है जिसकी पहचान अभी तक किसी और ने नहीं की है। प्रश्न है:

एक फ़ंक्शन घोषणा के बाद एक अर्धविराम (';') की आवश्यकता नहीं है। सही या गलत।

ठीक है, चलो एक फ़ंक्शन घोषणा देखें:

int func();       /* */
/*           ^       */
/*           |       */
/* That whitespace is "after the function declaration". */

वह पूरी बात घोषणा है । घोषणा नहीं है int func()और उसके बाद;। घोषणा है int func();और उसके बाद व्हाट्सएप है।

तो, सवाल यह है कि क्या घोषणा के बाद अर्धविराम की जरूरत है ? बिलकूल नही। घोषणा में पहले से ही एक अर्धविराम है, जिसने इसे समाप्त कर दिया। घोषणा के बाद एक अर्धविराम व्यर्थ होगा। इसके विपरीत, एक फ़ंक्शन घोषणा के बाद एकint func(); ; अर्धविराम होगा ।

सवाल लगभग निश्चित रूप से सवाल पूछने का था "सच या गलत: एक फ़ंक्शन घोषणा में अंतिम टोकन हमेशा एक अर्धविराम होता है" लेकिन यह सवाल वह नहीं है जो उन्होंने लिखा था, क्योंकि प्रश्नोत्तरी के लेखक समस्या के बारे में स्पष्ट रूप से नहीं सोच रहे थे।

मेरी सलाह है कि प्रोग्रामिंग लैंग्वेज क्विज़ से पूरी तरह बचें। वे बहुत भयानक हैं।


मजेदार तथ्य, जबकि हम इस विषय पर हैं। C # में, ये सभी कानूनी हैं:

class C {}
class D {};
struct E {}
struct F {};

सी # में, एक वर्ग या संरचना की घोषणा अर्धविराम में समाप्त हो सकती है, या आपके विवेक पर नहीं। C # में आने वाले C / C ++ प्रोग्रामर के लाभ के लिए यह अजीब सा फीचर जोड़ा गया था, जिनके पास अपनी उंगलियों में यह है कि प्रकार एक निरर्थक अर्धविराम में घोषणाएं समाप्त होती हैं; डिजाइन टीम उन्हें इस आदत के लिए दंडित नहीं करना चाहती थी। :-)


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
शमूएल एलवाई

25

आप इस तरह से भी एक समारोह की घोषणा कर सकते हैं:

int func(){
    return 1;
}

कथन बहुत अस्पष्ट है। सही उत्तर होना चाहिए: यह इस बात पर निर्भर करता है कि आप फ़ंक्शन को कैसे घोषित करते हैं।

वैसे भी, मैंने भी गलत चुना होगा, और शायद आप किसी को सवाल बता सकते हैं।


3
वैसे भी, एक व्यक्तिगत स्तर पर बात मत करो। महत्वपूर्ण बात यह है कि आप समझ गए हैं कि एक फ़ंक्शन घोषणा-परिभाषा कैसे काम करती है, इसलिए इसके बारे में बहुत अधिक चिंता न करें, बस सुनिश्चित करें कि प्रश्न कम से कम जांचा जाएगा और आगे बढ़ेगा
Luca Corsini

11
पूर्ण रूप से। ईमानदारी से, मैंने फ़ंक्शन घोषणा-परिभाषा के बारे में अधिक प्रश्न से गलत होने के बारे में सीखा, जितना मैंने इसे सही पाया है।
लोगन

1
@ लोगान बहुत ज्यादा चिंता न करें। यदि आप एक फ़ंक्शन लिखना और पढ़ना जानते हैं, जिसकी आपको आवश्यकता है। मैं व्यक्तिगत रूप से इस तरह के प्रश्नों से नफरत करता हूं कि 1. अच्छी तरह से परिभाषित नहीं हैं 2. वाक्यविन्यास के अपने सैद्धांतिक ज्ञान का परीक्षण करें। मेरे लिए यह मांसपेशियों की स्मृति की तरह है। जब मैं लिखता हूं कि प्रत्येक अंक आसानी से कुंजी के लिए जाता है, तो यह माना जाता है, लेकिन यदि आप मुझे इस बारे में एक परीक्षण देते हैं कि मुझे क्या कुंजी चाहिए तो मुझे एक कीबोर्ड प्रेस के बिना पूरी तरह से निराशाजनक होना चाहिए, शारीरिक रूप से कार्रवाई करने के लिए ...
bolov

2
... सामान्य वाक्यविन्यास (जैसे एक फ़ंक्शन की तरह) लिखना आपके लिए दूसरा स्वभाव बन जाएगा। और जब आप इसे गड़बड़ कर देंगे क्योंकि आपने सिर्फ भाषाओं को स्विच किया है, अच्छी तरह से ... त्वरित और कुशल समाधानों के लिए इंटेलीजेंस और वाक्य रचना हाइलाइटिंग। अपना समय और ऊर्जा कुछ अधिक उपयोगी में निवेश करें।
बोलोव

20

एक फ़ंक्शन घोषणा के बाद एक अर्धविराम (';') की आवश्यकता नहीं है।

सही या गलत।

सच है । किसी भी घोषणा के बाद अर्धविराम की आवश्यकता नहीं होती है। न ही किसी परिभाषा के बाद। न ही किसी बयान के बाद।

कई प्रकार की घोषणा को अर्धविराम के साथ समाप्त करना होगा, क्योंकि धारा 7 में वाक्य रचना [dcl.dcl] निर्दिष्ट करती है। लेकिन उसके बाद दूसरा लिखने की कोई जरूरत नहीं है।


1
मैं देख रहा हूं कि एरिक लिपर्ट ने पहले ही इस बात का तर्क दिया था। मुझे लगता है कि सभी upvotes ने मुझे इसे अनदेखा कर दिया। वहां अपने वोट डालने के लिए स्वतंत्र महसूस करें।
मार्क वैन लीउवेन

बहुत ज्यादा कोई भी सवाल जो पूछता है, "एक्स हमेशा सच होता है: सच्चा या गलत?" जवाब "झूठा" होने जा रहा है। हेक, कहीं भी अर्धविराम लगाने की आवश्यकता नहीं है ; संकलक शिकायत कर सकता है और आपके कार्यक्रम को संकलित करने से इनकार कर सकता है, लेकिन यह शायद ही दुनिया का अंत है; मैं इसे मूलभूत आवश्यकता नहीं कहूंगा । ;)
क्क्सप्लसोन

@Quuxplusone यदि कंपाइलर आपके प्रोग्राम को अस्वीकार कर देता है, तो आपके प्रोग्राम में कोई फंक्शन की घोषणा नहीं होती है :)
बेन मिलवुड

6

यह इस बात पर निर्भर करता है कि हम फ़ंक्शन को घोषित कर रहे हैं या परिभाषित कर रहे हैं। यदि हम फ़ंक्शन की घोषणा कर रहे हैं, तो हमें अर्धविराम ( ;) शामिल करने की आवश्यकता है , और यदि हम फ़ंक्शन को परिभाषित कर रहे हैं, तो अर्धविराम की आवश्यकता नहीं है।

एक घोषणा इस प्रकार है:

int add(int, int);

और एक परिभाषा इस प्रकार है:

int add(int a, int b)
{
    // ...
}

10
इस जवाब के साथ समस्या यह है कि यह सुझाव देता है कि परिभाषाएं और घोषणा परस्पर अनन्य हैं। वास्तव में, प्रत्येक परिभाषा एक घोषणा है; परिभाषाएँ घोषणाओं का एक सबसेट हैं।
एमएसएलटर्स

6

यद्यपि मैं लगभग सभी अन्य उत्तरों से सहमत हूं, यह कहते हुए कि प्रश्न बहुत अस्पष्ट है, और यह कि आपका उत्तर तकनीकी रूप से सही है, मुझे एक अलग दृष्टिकोण देने की अनुमति देता है:

इस तरह मैंने हमेशा उन्हें बुलाया है:

void func();  // The function prototype

...

void func()
{
    // The function definition
}

मैं मान रहा हूं कि यह प्रश्न इस शब्दावली को ध्यान में रखकर बनाया गया था।

मेरी दृष्टि में परिभाषा और घोषणा दोनों एक ही अवधारणा हैं। "मैं x = y को परिभाषित करता हूं" == "मैं x = y घोषित करता हूं"।

लेकिन निश्चित रूप से, फ़ंक्शन प्रोटोटाइप (शीर्ष पर) और फ़ंक्शन की वास्तविक परिभाषा के बीच एक बड़ा अंतर है।


मेरे लिए आपके प्रोटोटाइप की घोषणा है कि मैंने कैसे सीखा (यह कहते हुए कि आप हालांकि गलत हैं या नहीं) के आधार पर, लेकिन फिर मैं भी प्रोटोटाइप की संख्या और प्रकार के तर्क, या शून्य को निर्दिष्ट करने की उम्मीद करूंगा, लेकिन मुझे उम्मीद है कि आप चूक गए थे संक्षिप्तता के लिए।
डेविड एस

डेविड एस: हां, यह भी कि इसमें संख्या और प्रकार के तर्क शामिल होंगे, लेकिन मैंने वास्तव में उन्हें संक्षिप्तता के लिए छोड़ दिया (ध्यान दें कि वास्तविक फ़ंक्शन घोषणा में भी कोई तर्क नहीं हैं)। हालाँकि, मैं वास्तव में सहमत नहीं हूँ जब आप कहते हैं कि पूर्ण फ़ंक्शन घोषणा को प्रोटोटाइप कहा जाता है। मैं विकिपीडिया को उद्धृत करता हूं: "एक फ़ंक्शन प्रोटोटाइप या फ़ंक्शन इंटरफ़ेस एक फ़ंक्शन की घोषणा है जो फ़ंक्शन के नाम और प्रकार के हस्ताक्षर (arity, डेटा प्रकार के पैरामीटर और वापसी प्रकार) को निर्दिष्ट करता है, लेकिन फ़ंक्शन बॉडी को छोड़ देता है।"
ऑप्फेक्स

@ डेविड: सी ++ में, फ़ंक्शन घोषणाएं हमेशा प्रोटोटाइप (या परिभाषाएं) होती हैं, और void func();बिल्कुल इसके बराबर होती हैं void func(void);। यह C से बिलकुल अलग है , जहाँ void func();संकलक को आर्ग के बारे में कुछ भी नहीं बताता है, और इसके समान नहीं है void func(void);। एक बाद का प्रोटोटाइप या परिभाषा एक अच्छा विचार है, अन्यथा कॉल करने वाले को डिफ़ॉल्ट arg प्रमोशन (जैसे फ्लोट -> डबल, और संकीर्ण पूर्णांक प्रकार) लागू करने होते हैं int। वैरिक फ़ंक्शंस के लिए args के समान नियम।)
पीटर

मेरी क्षमायाचना, मैं सी से संबंधित कुछ चीज़ों को देखकर यहाँ समाप्त हुआ और भाषा के परिवर्तन पर ध्यान नहीं दिया। मैं अपनी टिप्पणी को स्पष्टता के हितों में नहीं हटाऊंगा, लेकिन इसे वापस लेने पर विचार करूंगा।
डेविड एस

6

यह एक अफ़सोस की बात है कि आपने "सीधे बाद" नहीं कहा। हम उदाहरण के लिए यह लिख सकते हैं:

int func()  /* My function */ ;

या मैं लिख सकता था:

int func()
int a = 42;

पहले मामले में अर्धविराम सीधे घोषणा के बाद नहीं है , लेकिन यह ठीक होगा।

दूसरे मामले में "घोषणा के बाद" एक अर्धविराम है, लेकिन सीधे बाद नहीं।

मुझे लगता है कि एरिक लिपर्ट ने अपने जवाब में सही विचार दिया है

यह कहने जैसा है कि "अंग्रेजी में एक वाक्य की समाप्ति के बाद की अवधि होनी चाहिए?"। तार्किक रूप से, पहले से ही एक वाक्य के अंत में एक अवधि है (अन्यथा यह एक वाक्य नहीं होगा) और इसलिए वहाँ एक अवधि नहीं होना चाहिए के बाद सजा ..


4
अच्छा लगा। एक अतिरिक्त अवधि के साथ उस वाक्य को समाप्त करना। आपने वहां क्या किया वह मैने देखा।
डेविड एस

2
int func() int a=42;संकलन नहीं है। आपको एक अल्पविराम की आवश्यकता है, दूसरे की नहीं int। इससे पहले एक दिन में @ Arne का जवाब देखें। इस उत्तर में एकमात्र नई बात अंतिम पैराग्राफ है, जिसमें अंग्रेजी वाक्यों की सादृश्यता है।
पीटर कॉर्ड्स

1
मैंने यह नहीं कहा कि दूसरा उदाहरण संकलित है। मैं यह कहते हुए इशारा कर रहा था कि घोषणा के बाद "अर्धविराम की आवश्यकता थी" जो अस्पष्ट था। मेरे उदाहरण में घोषणा के बाद एक अर्धविराम था लेकिन यह संकलन नहीं करता है
निक गैमन

1
त्रुटि संदेशों में भी यही समस्या होती है; C # से एक पसंदीदा उदाहरण है " एक पैरामीटर पैरामीटर एक औपचारिक पैरामीटर सूची में अंतिम पैरामीटर होना चाहिए "। अब, मान लीजिए कि मैंने कहा कि "एक फ्रोब एक ग्लोब सूची में अंतिम ग्लोब होना चाहिए"। क्या इसका मतलब (1) हर ग्लोब की सूची में अंत में एक फ्रोब है, जैसे हर प्रश्न के अंत में एक प्रश्न चिह्न होता है, (2) ग्लोब की सूची में किसी भी संख्या में मेंढक हो सकते हैं, लेकिन अगर इसमें एक या अधिक मेंढक हों तो , अंतिम आइटम एक फ्रोब होना चाहिए, एक समान संख्या में 02468 की कोई भी संख्या हो सकती है, लेकिन अंतिम में से एक होना चाहिए, या ...
एरिक लिपर्ट

... (3) ग्लोब की सूची में शून्य या एक मेंढक हो सकता है, और यदि यह एक है, तो यह अंत में आता है? यदि आप संदर्भ नहीं जानते हैं, तो मुझे लगता है कि (1) सबसे समझदार व्याख्या है, लेकिन "पैरामीटर पैरामीटर" के मामले में, (3) सही स्पष्टीकरण है। प्रोग्रामिंग भाषा तत्वों के कई अनौपचारिक विवरणों में एक संपत्ति है जो मेरे तकनीकी संपादक मित्रों को "COIK" कहते हैं - केवल साफ अगर ज्ञात। यदि आप पहले से ही सामग्री को अच्छी तरह से नहीं समझते हैं, तो इसका विवरण आपके लिए बेकार है, लेकिन यदि आप पहले से ही इसे अच्छी तरह से समझते हैं, तो आपको विवरण की आवश्यकता नहीं है!
एरिक लिपर्ट

4

आप ;केवल प्रोटोटाइप के लिए उपयोग कर सकते हैं ।


4

यह एक कठिन प्रश्न है, लेकिन उन्होंने घोषणा शब्द का उपयोग किया है, जिसका अर्थ कुछ इस प्रकार है:

int example();

तो यह इस मामले में सच है।

यदि वे शब्द कार्यान्वयन का उपयोग करते हैं तो यह गलत था।


2

अर्धविराम (;) का उपयोग संकलक को यह बताने के लिए किया जाता है कि इसके बाद अर्धविराम (?) एक नया कथन शुरू होता है।

इसलिए मुझे लगता है कि अर्धविराम (;) केवल एक कार्य घोषणा के दौरान आवश्यक है। तो मेरे हिसाब से जवाब सही होगा।


घोषणाएँ हालांकि बयान नहीं हैं।
पवित्रब्लैककैट

लेकिन फ़ंक्शन घोषणा के बाद, हम संकलक का उपयोग करके कोड की एक नई लाइन निष्पादित कर रहे हैं। इसलिए मुझे लगता है कि कोड कंपाइलर की एक नई लाइन को निष्पादित करने से पहले यह जानना होगा कि कोड की पिछली पंक्ति कहाँ समाप्त होती है तभी एक कंपाइलर देशी कोड (यानी 0101) उत्पन्न कर सकता है।
जतिंदर

2

जब कार्यों को मुख्य से पहले परिभाषित किया जाता है () :

  • अर्धविराम की आवश्यकता नहीं है क्योंकि फ़ंक्शन पहले से ही परिभाषित है

जब कार्य मुख्य के बाद परिभाषित होते हैं () :

  • अर्धविराम की आवश्यकता है क्योंकि आप उस फ़ंक्शन को प्रोटोटाइप कर रहे हैं और संकलक को बता रहे हैं कि फ़ंक्शन बाहर निकलता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.