2012-04-24 17 views
19

मैं इस code पढ़ने, और इस लाइन!! सी ऑपरेटर, दो नहीं है?

switch (!!up + !!left) { 

!! ऑपरेटर क्या है? दो तार्किक नहीं?

+0

यूप। लगता है कि जो भी लिखा है उसे पता नहीं था कि वे क्या कर रहे थे। – AndyG

+4

क्या आपको लगता है, आप जानते हैं, इसे आजमाएं और पता लगाएं? –

+0

@ सॉसमास्टर, असल में यह शून्य/nonzero को 0/1 पर मैप करने के लिए एक मुहावरे है। यह इस विशेष उपयोग मामले में अत्यधिक चालाक के रूप में भी योग्य हो सकता है (देखें "समयपूर्व अनुकूलन")। – geekosaur

उत्तर

30

हाँ, यह दो नोट्स है।

!!a है 1 अगर a गैर-शून्य है और 0 अगर a0

है आप clamping के रूप में !! के बारे में सोच सकते हैं, के रूप में यह थे, {0,1} करने के लिए। मैं व्यक्तिगत रूप से उपयोग को फैंसी प्रकट करने का एक बुरा प्रयास ढूंढता हूं।

+12

डबल गाँठ से उलझन में नहीं है, जो बाहर निकलना मुश्किल है। – FlavorScape

+4

यह इतना "क्लैंपिंग" नहीं है क्योंकि यह "सामान्यीकरण" है। – kittemon

+6

यदि आपको यह पसंद नहीं है, तो आप क्या पसंद करेंगे? '(_Bool)' (या '(बूल)' यदि 'stdbool.h' शामिल किया गया है) सी 99 पर काम करता है लेकिन यह सी 99 पर कृतज्ञता से निर्भर करता है, और मुझे लगता है कि बहुत कम लोग समझते हैं कि कैसे कास्ट-टू-बूल समझने से काम करता है '!!' मुहावरे। दूसरा विकल्प, 'expr? 1: 0', सिर्फ बदसूरत और gratuitously verbose है। –

3

आप सही हैं। यह दो नंबर है।

#include <stdio.h> 

int foo(const int a) 
{ 
    return !!a; 
} 

int main() 
{ 
    const int b = foo(7); 
    printf(
     "The boolean value is %d, " 
     "where 1 means true and 0 means false.\n", 
     b 
    ); 
    return 0; 
} 

यह The boolean value is 1, where 1 means true and 0 means false. आउटपुट आप ड्रॉप !! है, हालांकि, यह आउटपुट The boolean value is 7, where 1 means true and 0 means false.

5

यदि आप इसे इस तरह कल्पना कर सकते हैं:

!(!(a)) 
देखने के लिए क्यों एक यह करना होगा, इस कोड की कोशिश

यदि आप इसे चरण-दर-चरण करते हैं, तो यह समझ में आता है

result = !42; //Result = 0 
result = !(!42) //Result = 1 because !0 = 1 

यह किसी भी संख्या (-42, 4.2f, आदि), लेकिन केवल 0 साथ साथ 1 वापस आ जाएगी, इस वसीयत होता

result = !0; //Result = 1 
result = !(!0) //result = 0 
4

!!(_Bool) के लिए एक अधिक-पोर्टेबल (पूर्व C99) विकल्प नहीं है।

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