2016-02-28 13 views
8

मेरे एक दोस्त ने मजाक से मुझसे यह सवाल पूछा। इसका मतलब "बिना कहने के चला जाता है" टाइप किया गया था, लेकिन फिर मैंने वास्तव में थोड़ी देर के लिए इसके बारे में सोचा और कुछ चालाक "लगभग समाधान" के साथ आने लगे।कब है (x ||! X) झूठा?

प्रथम प्रयास:

तो सी कभी क्वांटम कंप्यूटिंग इस का जवाब हो सकता है समर्थन करता है। एक क्यू-बिट कई राज्यों में एक बार में हो सकता है, इसलिए यह गलत और सत्य हो सकता है और यह सशर्त (BOOL)0.5 उर्फ ​​"हां/नहीं/शायद-तो" लौटाएगा - लेकिन एक बार जब आप चर का निरीक्षण करेंगे तो पूरी चीज गिर जाएगी और अमान्य हो जाएगी फिर।

दूसरा प्रयास:

तो एक्स किसी भी तरह एक यादृच्छिक द्विआधारी जनरेटर के रूप में परिभाषित किया जा सकता है और आप इसे एक BOOL लिए डाली आप गलत हो सकता है समय की कुछ। मुझे यकीन नहीं है कि अगर आप सी में ऐसा कर सकते हैं, तब तक आप CLANG का उपयोग नहीं करते हैं। #define x (BOOL)!!(rand()%2)



भाषा हम इस में चर्चा कर रहे थे सी है लेकिन किसी को भी किसी भी भाषा में किसी भी समाधान मिल सकता है मैं भी उत्सुक हूँ।

+2

उत्तर: अपरिभाषित व्यवहार। – SLaks

+9

यही सवाल हैमलेट सैकड़ों साल पहले पूछ रहा था: 'बीबी || ! Bb'। – nsilent22

+0

@ nsilent22 मैंने थोड़ा कठोर हँसे –

उत्तर

16

जब x अस्थिर (volatile int x) है और एक बाहरी धागा/उपकरण के आधार पर संशोधित किया गया है, अभिव्यक्ति झूठी हो सकता है।

+0

दिलचस्प समाधान! मुझे आश्चर्य है कि कोड –

+0

कोड में किसी अन्य बिंदु पर परिवर्तनीय को सीधे संशोधित किए बिना ऐसा करने का कोई तरीका है, जैसा कि मैंने इंगित किया है, यदि 'x' को बाहरी रूप से संशोधित स्मृति स्थान/रजिस्टर में मैप किया गया है, तो यह" स्वचालित रूप से " – Amit

+0

हो सकता है आप सही हे! वह सुंदर प्रतिभा है! हालांकि यह हमेशा * झूठ नहीं होगा, हम्म –

4

मैक्रोज़ वास्तव में यहां धोखा दे रहे हैं, लेकिन आपको बूलियन प्रकार या विशेष कंपाइलर्स के साथ कुछ भी करने की आवश्यकता नहीं है।

int y = 0; 
#define x y++ 

(अपरिभाषित व्यवहार के बारे में चिंतित लोगों के लिए, ध्यान दें बाईं के बीच एक दृश्य मतलब नहीं है: निम्न, जहाँ तक मुझे पता है, कानूनी मानक सी

#include <stdio.h> 
int f(void) { 
    static int y = 0; 
    if (y == 0) { 
    y = 1; 
    return 0; 
    } else { 
    return 1; 
    } 
} 

#define x f() 

int main(void) { 
    if (x || !x) { 
    puts("It was true"); 
    } else { 
    puts("It was false"); 
    } 
    return 0; 
} 

या और भी अधिक संक्षेप में है और || के दाईं ओर)

+0

मैं ओब्जे-सी में CLANG का उपयोग करके इस तरह कुछ पर काम कर रहा था। मुझे यह अब तक # डिफाईन एक्स (बूल) मिला है [[NSUserDefaults standardUserDefaults] integerForKey: @ "x"]; [[NSUserDefaults standardUserDefaults] setInteger: (int)! (BOOL) [[NSUserDefaults standardUserDefaults] integerForKey: @ "x"] forKey: @ "x"]; [[NSUserDefaults standardUserDefaults] सिंक्रनाइज़ करें]; 'यह समझने से पहले कि मैं उद्देश्य-सी (जहां तक ​​मुझे पता है) में सशर्त के अंदर कार्य नहीं हो सकता है –

+0

@AlbertRenshaw: मेरे पास कोई सुराग नहीं है ऐसा करता है, लेकिन ऐसा लगता है कि waaaaaaayayay overcomplicated।'#define एक्स 1 && 0' या यहाँ तक कि' #define एक्स 1,0' –

9

यह एक चाल का एक सा है, लेकिन निम्न समाधान भी काम करता है:।

#define x 1 ? 0 : 1 
(x || !x) 

कारण ऑपरेटर प्राथमिकता में है। preprocessing के बाद (x || !x) निम्नलिखित (पूर्वता दिखाने के लिए जोड़ा कोष्ठकों) पर ले कर जाता:

(1 ? 0 : (1 || !1) ? 0 : 1) 
+1

यह शानदार है fav जवाब अब तक –

+2

आप इसे और भी आसान बना सकते हैं! कृपया इसे पोस्ट: डी – Joni

+0

@Joni एक महान जवाब है कि: - –

4

एक भी सरल मैक्रो:

#define x 0&0 

(x || !x) के विस्तार (0 & 0 || !0 & 0) देता है जो हमेशा गलत है।

इसी

:

#define x 0*0 
#define x 1*0 // for binary buffs 
#define x 4&2 // for HHGG fans. 

मैं एक 2 पत्र मैक्रो :(

+0

इस मामले में किसी भी मैक्रो '... और 0' – vittore

+1

@vittore काम करेगा: वास्तव में '1 & 0' काम करते हैं और कम पिक्सल है होता है, और' 4 & 2' अधिक nerdy है। – chqrlie

2

यदि x एक charecter प्रकार है नहीं पा सके (यानी int नहीं या bool) तो जे एस, पीएचपी जैसे कुछ भाषा आदि परिणाम कर सकते हैं एक झूठी के रूप में अभिव्यक्ति।

प्रकार कास्टिंग त्रुटि

के लिए

के मामले में इसका मतलब है कि

char x = "string";

(एक्स ||! X) = झूठी (0 या NaN)

वे समर्थन अच्छी तरह प्रकार कास्टिंग किसी भी त्रुटि नहीं दिखा था या इस त्रुटि स्वयं कास्टिंग द्वारा हटाया जा सकता है कि भाषा।

स्वयं कास्ट उदा। चार ए = "10"; int बी = (int) ए;

नया वर्क। भाषा में भी बल्लेबाज कास्ट एनजिन शामिल हैं।

1

जे एस में की कोशिश की:

वर मैं = 0

i ++ || ! (i ++)

नोट: यह समाधान केवल तभी काम करता है जब i = 0

+0

कृपया कोड का नमूना बटन जो के रूप में दिखाया जा सकता है प्रेस {} तो अपने कोड पेस्ट करें। –

संबंधित मुद्दे