C में &&& ऑपरेशन क्या है


195
#include <stdio.h>

volatile int i;

int main()
{
    int c;

    for (i = 0; i < 3; i++) 
    {
         c = i &&& i;
         printf("%d\n", c);
    }

    return 0;
}

उपयोग करके संकलित उपरोक्त कार्यक्रम का आउटपुट gccहै

0
1
1

साथ -Wallया -Waddressविकल्प, gccएक चेतावनी जारी करता है:

warning: the address of i will always evaluate as true [-Waddress]

cउपरोक्त कार्यक्रम में मूल्यांकन कैसे किया जा रहा है?


42
मुझे विश्वास है कि यह है i && (&i)? दिलचस्प है कि मुझे SO पर डुप्लिकेट पोस्ट नहीं मिल रही है।
irrelephant

42
while (i &&& i <-- j) {}
kennytm


8
डुप्लिकेट नहीं, बल्कि इसी तरह का प्रश्न और यह एक अच्छी कड़ी है
नाथन कूपर

जवाबों:


272

यह c = i && (&i);दूसरा हिस्सा बेमानी है, क्योंकि &iइसका मूल्यांकन कभी नहीं किया जाएगा false

उपयोगकर्ता-परिभाषित प्रकार के लिए, जहां आप वास्तव में एकतरफा अधिभार कर सकते हैं operator &, यह अलग हो सकता है, लेकिन यह अभी भी एक बहुत बुरा विचार है

यदि आप चेतावनी जारी करते हैं , तो आपको कुछ मिलेगा:

चेतावनी: 'i' का पता हमेशा 'सही' के रूप में मूल्यांकित होगा


1
क्यों नहीं c = i & (&&i);:; iकुछ लेबल कहाँ है?
ऐशसेन

4
@ गायबसेन iके रूप में परिभाषित किया गया है intऔर सवाल में कोई लेबल नहीं है। इसके अलावा, अधिकतम चबाना ...
लुचियन ग्रिगोर

5
@ गायब हो गया: और &&लेबल का पता लेने के लिए ऑपरेटर वैसे भी गैर-मानक gcc एक्सटेंशन है। लेकिन भले ही यह मानक था, अधिकतम मंक नियम इसे इस तरह से पार्स होने से रोक देगा (जब तक कि आप एक स्थान नहीं डालें)।
कीथ थॉम्पसन

दरअसल, &iमूल्यांकन कर सकते हैं false। इसका इस्तेमाल कभी-कभी चूक के लिए किया जाता है। उदाहरण: void fn(type& x = *reinterpret_cast<type*>(NULL)); का मूल्य क्या है &xमें fnयदि fnपैरामीटर के बिना कहा जाता है? यह 0 उर्फ ​​झूठ है। हालांकि, इसे वर्णित तरीके का उपयोग करते हुए, यह हमेशा सच होगा जब तक कि i == 0, और यदि कोई इसका उपयोग नहीं कर रहा है जैसा कि मैंने वर्णित किया है, तो यह होगा c = &i && i
एड्रियन

@LuchianGrigore: ऐसा कैसे?
एड्रियन

118

&&&सी। में कोई ऑपरेटर या टोकन नहीं है &&( लेकिन तार्किक "और") और &(एकात्मक पता या बिटवाइज़ "और") ऑपरेटर मौजूद हैं।

तक अधिक से अधिक मंच नियम, इस:

c = i &&& i;

इसके बराबर है:

c = i && & i;

यह सेट c1 दोनों अगर करने के लिए iऔर &iसत्य हैं, और 0 कि क्या उनमें से या तो गलत है।

एक उदाहरण के लिए, कोई भी गैर-शून्य मान सत्य है। पॉइंटर के लिए, कोई भी गैर-शून्य मान सही है (और किसी ऑब्जेक्ट का पता हमेशा गैर-शून्य है)। इसलिए:

यह c1 पर सेट होता है यदि iगैर शून्य है, या 0यदि iशून्य के बराबर है।

जिसका तात्पर्य यह है कि &&&यहाँ सिर्फ जानबूझकर होने वाले आक्षेप के लिए इस्तेमाल किया जा रहा है। असाइनमेंट निम्नलिखित में से कोई भी हो सकता है:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.