2010-09-07 20 views
16

मुझे पता है कि सी में, अगर बयानों और तुलना FALSE = 0 के लिए और कुछ और सत्य के बराबर है।सी में 0 क्या है?

इसलिए,

int j = 40 
int k = !j 

k == 0 // this is true 

मेरा प्रश्न विपरीत संभालती है। क्या होता है! 0 बन गया? 1?

int l = 0 
int m = !l 

m == ? // what is m? 
+12

क्यों नहीं यह कोशिश? –

+1

@ जोश के: बिल्कुल सही सलाह। मेरी इच्छा है कि हर कोई इसे पहले कोशिश करेगा, और फिर उन परिणामों के बारे में पूछें जिन्हें वे वास्तव में प्राप्त करते हैं। –

+13

@ जोश के: क्योंकि यह सप्ताह के कंपाइलर/मानक/दिन (यदि यह परिभाषित व्यवहार नहीं है, उदाहरण के लिए, हालांकि स्पष्ट रूप से यह इस मामले में है) द्वारा अलग-अलग हो सकता है, इसलिए एक परिणाम परिणाम देखने से यह सटीक रूप से प्रतिबिंबित नहीं हो सकता है किसी अन्य दिए गए सेटअप पर होगा। –

उत्तर

30

बूलियन/तार्किक ऑपरेटरों देखें सी में की आवश्यकता होती है घ उपज के लिए या तो 0 या 1.

आईएसओ C99 मानक की धारा 6.5.3.3/5 से

:

तार्किक निषेध ऑपरेटर ! का परिणाम 0 अगर इसकी संकार्य के मूल्य के असमान की तुलना करता है 0, 1 इसके संकार्य के मूल्य में 0.

वास्तव में करने के लिए बराबर की तुलना, !!x एक मूल्य के लिए मजबूर कर रहा होने के लिए के लिए एक आम मुहावरा है अगर या तो 0 या 1 (मैं व्यक्तिगत रूप से x != 0, हालांकि पसंद करते हैं)।

इसके अलावा Q9.2 from the comp.lang.c FAQ देखते हैं।

+3

अच्छी कॉल। ऐसा लगता है कि हम में से अधिकतर वास्तव में लापरवाह आईएसओ मानक को पढ़ने की जरूरत है। मानक को इंगित करने के लिए –

+4

+1, लेकिन '!!' का उपयोग करने वाले कोड को कचरे के लिए सीधे सिर की आवश्यकता होती है। –

+0

बेशक बहुत सारे सी कंपाइलर्स विशेष रूप से आईएसओ मानक का पालन करने के लिए मजबूर नहीं होते हैं। जीसीसी शायद, लेकिन किसी और के साथ यह एक बकवास है। –

1

आम तौर पर, हाँ, यह 1. जैसा कि कहा गया है कि भले ही व्यवहार मैं कोड है कि उस पर भरोसा बहुत भयंकर होने का विचार था (जो मैं के बारे में सुनिश्चित नहीं कर रहा हूँ) की गारंटी है हो जाएगा।

आप मान सकते हैं कि यह एक सही मूल्य है। मैं और कुछ नहीं मानूंगा।

+8

आम तौर पर नहीं; *हमेशा*। सी में बूलियन ऑपरेटरों को या तो 0 या 1. – jamesdlin

+0

वापस करने की आवश्यकता है, फिर भी, यह आपके कोड शो के इरादे के उल्लंघन की तरह लगता है। –

+2

बिलकुल नहीं। 'Prefix =' जैसी चीजें - "+! नकारात्मक; 'पूरी तरह से सीन सी –

1

बैंग ऑपरेटर (!) तार्किक नहीं ऑपरेटर C, C++ और सी # में अधिक पाया, इसलिए

!0 == 1 
!1 == 0 

यह वही सही या गलत होने की व्याख्या की है की भाषा विशेषता पर आधारित है। .. और अधिक आधुनिक भाषाओं में यह इस

!false == true 
!true == false 

जैसा होगा DeMorgan सच्चाई टेबल के विषय में कानून ...

+3

वास्तव में, सी ++ में, '' एक 'bool' संकार्य लेता है और पैदा करता है एक' bool' परिणाम 'और 'झूठी' से' 0', और अन्य पूर्णांक प्रकारों से 'बूल' तक, '0'' को 'झूठी' में परिवर्तित करने के साथ, और कोई अन्य मान 'सत्य' में परिवर्तित हो रहा है। –

3

§6.5.3.3/5: "तार्किक अस्वीकरण ऑपरेटर का नतीजा 0 है यदि उसके ऑपरेंड का मूल्य असमान 0 से 1 की तुलना करता है, यदि उसके ऑपरेंड का मान 0 के बराबर है। परिणाम के प्रकार int । "

अन्य लॉजिकल ऑपरेटरों (उदाहरण के लिए, &&, ||) हमेशा 0 या 1 का उत्पादन करते हैं।

0

!x(x==0) इसलिए का विस्तार होगा:

  • यदि x = 0 ->!x ले मूल्य से (0==0) = TRUE (मूल्य 1) ​​
  • यदि x = 0 ->!x(x==0) से मान ले! = FALSE (मूल्य 0)
संबंधित मुद्दे