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.