मैं बहुत समय पहले एक मंच पर एक दिलचस्प सवाल पर ठोकर खाई थी और मैं इसका जवाब जानना चाहता हूं।
निम्नलिखित सी फ़ंक्शन पर विचार करें:
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
इसके false
बाद से हमेशा लौटना चाहिए var3 == 3000
। main
समारोह इस तरह दिखता है:
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
चूँकि f1()
हमेशा वापस आना चाहिए false
, इसलिए किसी को यह उम्मीद होगी कि कार्यक्रम स्क्रीन पर केवल एक ही गलत प्रिंट करेगा । लेकिन इसे संकलित करने और चलाने के बाद, निष्पादित भी प्रदर्शित किया जाता है:
$ gcc main.c f1.c -o test
$ ./test
false
executed
ऐसा क्यों है? क्या इस कोड में किसी प्रकार का अपरिभाषित व्यवहार है?
नोट: मैंने इसे संकलित किया है gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
।
main()
लिए सरलीकरण किया जा सकता है int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
- यह विसंगति को बेहतर दिखाएगा।
void
?
true
और false
कश्मीर एंड आर 1 एड में।, इसलिए नहीं सब पर इस तरह की समस्याओं थे। यह सच और झूठ के लिए सिर्फ 0 और गैर-शून्य था। है ना? मुझे नहीं पता कि उस समय प्रोटोटाइप उपलब्ध थे या नहीं।
_Bool
प्रकार और कोई <stdbool.h>
हेडर नहीं था ।
f1()
उसी फ़ाइल में कॉपी करते हैंmain()
, तो आपको कुछ अजीबता मिलेगी: जबकि यह C ++ में सही()
पैरामीटर सूची के लिए उपयोग करने के लिए सही है, सी में एक फ़ंक्शन के लिए उपयोग किया जाता है, जो अभी तक परिभाषित पैरामीटर सूची के साथ नहीं है ( यह मूल रूप से)
) के बाद एक कश्मीर और आर-शैली पैरामीटर सूची की उम्मीद करता है । C सही होने के लिए, आपको अपना कोड बदलना चाहिएbool f1(void)
।