C ++ में Booleans के लिए बिटवाइज़ ऑपरेटरों का उपयोग करना


84

क्या कोई कारण बिटकॉइन संचालकों का उपयोग नहीं करना है; और C ++ में "बूल" मानों के लिए ^?

मैं कभी-कभी उन स्थितियों में भाग लेता हूं जहां मैं चाहता हूं कि दो स्थितियों में से एक सही हो (XOR), इसलिए मैं सिर्फ ^ ऑपरेटर को सशर्त अभिव्यक्ति में फेंक देता हूं। मैं कभी-कभी यह भी चाहता हूं कि किसी हालत के सभी हिस्सों का मूल्यांकन किया जाए कि परिणाम सही है या नहीं (शॉर्ट-सर्कुलेटिंग के बजाय), इसलिए मैं & & का उपयोग करता हूं। मुझे कभी-कभी बूलियन मूल्यों को जमा करने की भी आवश्यकता होती है, और & = और = = काफी उपयोगी हो सकता है।

मैंने ऐसा करते समय कुछ उभरी हुई भौंहें पकड़ ली हैं, लेकिन कोड अभी भी सार्थक है और क्लीनर की तुलना में यह अन्यथा होगा। क्या बूल के लिए इनका उपयोग करने का कोई कारण नहीं है? क्या कोई आधुनिक संकलक हैं जो इसके लिए खराब परिणाम देते हैं?


यदि आपने इस प्रश्न को पूछने के बाद से सी ++ के बारे में पर्याप्त रूप से सीखा है, तो आपको वापस आना चाहिए और वर्तमान उत्तर को स्वीकार करना चाहिए और शॉर्ट-सर्कुलेटिंग अंतर को सही ढंग से समझाने के लिए पैट्रिक जॉम्नेयर के उत्तर को स्वीकार करना चाहिए।
कोडेटाकु

सामान्य टिप्पणी क्योंकि लोग सवाल करते हैं कि क्या यह एक अच्छा विचार है। यदि आप इकाई परीक्षणों की शाखा कवरेज की परवाह करते हैं, तो शाखाओं को कम करना वांछनीय है। इसके लिए बिटवाइज ऑपरेटर्स उपयोगी हैं।
qznc

जवाबों:


61

||और &&बूलियन ऑपरेटर हैं और बिल्ट-इन लोगों को trueया तो लौटने की गारंटी है false। और कुछ नहीं।

|, &और ^बिटवाइज़ ऑपरेटर हैं। जब आपके द्वारा संचालित संख्याओं का डोमेन सिर्फ 1 और 0 होता है, तो वे बिल्कुल समान होते हैं, लेकिन ऐसे मामलों में जहां आपके बूलियंस सख्ती से 1 और 0 नहीं हैं - जैसा कि सी भाषा के साथ है - आप कुछ व्यवहार के साथ समाप्त हो सकते हैं तुम नहीं चाहते थे। उदाहरण के लिए:

BOOL two = 2;
BOOL one = 1;
BOOL and = two & one;   //and = 0
BOOL cand = two && one; //cand = 1

C ++ में, हालांकि, boolप्रकार केवल या तो एक होने की गारंटी trueहै false(जो क्रमशः रूप में परिवर्तित होता है 1और 0), इसलिए यह इस रुख से कम चिंता का विषय है, लेकिन तथ्य यह है कि लोगों को कोड में ऐसी चीजों को देखने की आदत नहीं है इसे न करने के लिए एक अच्छा तर्क देता है। बस कहें b = b && xऔर इसके साथ किया जाए।


C ++ में तार्किक xor ऑपरेटर ^ ^ जैसी कोई चीज नहीं। बूल के रूप में दोनों के लिए तर्क! यकीन नहीं होता कि यह कैसे स्वीकार हो गया ...
ग्रेग रोजर्स

1
रेट्रोस्पेक्ट में, वह थोथा गूंगा था। वैसे भी, समस्या को ठीक करने के लिए उदाहरण को && में बदल दिया है। मैं कसम खाता हूँ कि मैंने ^ ^ का उपयोग कुछ समय पहले किया है, लेकिन यह मामला नहीं रहा होगा।
पैट्रिक

C में एक बूल प्रकार है जो केवल 10 साल के बाद से केवल 0 या 1 हो सकता है। _Bool
Johannes Schaub - litb

16
वे अभी भी बूल के लिए समान नहीं हैं क्योंकि वे कम
परिधि

4
हाँ, मेरा दृढ़ता से मानना ​​है कि जब तक आप परिवर्तित नहीं करते हैं, तब तक यह स्वीकृत उत्तर नहीं होना चाहिए "जब आपके द्वारा संचालित संख्याओं का डोमेन सिर्फ 1 और 0 होता है, तो वे ठीक उसी तरह होते हैं" जब आप जिस संख्या पर काम करते हैं उसका डोमेन सिर्फ 1 होता है और 0, अंतर केवल इतना है कि बिटवाइज़ ऑपरेटर्स शॉर्ट-सर्किट नहीं करते हैं "। पूर्व कथन बिल्कुल गलत है, इसलिए इस बीच मैंने इस उत्तर को अस्वीकार कर दिया है क्योंकि इसमें वह वाक्य शामिल है।
कोडेटाकु

32

दो मुख्य कारण। संक्षेप में, ध्यान से विचार करें; इसका एक अच्छा कारण हो सकता है, लेकिन अगर आपकी टिप्पणियों में बहुत स्पष्ट है क्योंकि यह भंगुर हो सकता है और, जैसा कि आप खुद कहते हैं, लोग आमतौर पर इस तरह कोड देखने के अभ्यस्त नहीं होते हैं।

बिटवाइर एक्सोर! = लॉजिकल एक्सोर (0 और 1 को छोड़कर)

सबसे पहले, यदि आप के अलावा अन्य मूल्यों पर काम कर रहे हैं falseऔर true(या 0और 1, पूर्णांक के रूप), ^ऑपरेटर व्यवहार एक तार्किक XOR के बराबर नहीं लागू कर सकते हैं। उदाहरण के लिए:

int one = 1;
int two = 2;

// bitwise xor
if (one ^ two)
{
  // executes because expression = 3 and any non-zero integer evaluates to true
}

// logical xor; more correctly would be coded as
//   if (bool(one) != bool(two))
// but spelled out to be explicit in the context of the problem
if ((one && !two) || (!one && two))
{
  // does not execute b/c expression = ((true && false) || (false && true))
  // which evaluates to false
}

इसे पहले व्यक्त करने के लिए उपयोगकर्ता @Patrick को श्रेय।

कार्रवाई के आदेश

दूसरा, |, &, और^ , बिटवाइज़ ऑपरेटर्स के रूप में, नहीं शॉर्ट सर्किट है। इसके अलावा, एक ही बयान में कई बिटवाइज़ ऑपरेटरों को एक साथ जंजीर - यहां तक ​​कि स्पष्ट कोष्ठक के साथ - संकलक का अनुकूलन करके फिर से व्यवस्थित किया जा सकता है, क्योंकि सभी 3 ऑपरेशन सामान्य रूप से सराहनीय हैं। यह महत्वपूर्ण है अगर संचालन का क्रम मायने रखता है।

दूसरे शब्दों में

bool result = true;
result = result && a() && b();
// will not call a() if result false, will not call b() if result or a() false

हमेशा के रूप में एक ही परिणाम (या अंत राज्य) नहीं देंगे

bool result = true;
result &= (a() & b());
// a() and b() both will be called, but not necessarily in that order in an
// optimizing compiler

यह विशेष रूप से महत्वपूर्ण है क्योंकि आप विधियों को नियंत्रित नहीं कर सकते हैं a()और b(), या कोई और साथ आ सकता है और उन्हें बदल सकता है बाद में निर्भरता को समझ नहीं सकता है, और एक बुरा (और अक्सर रिलीज़-बिल्ड केवल) बग पैदा कर सकता है।


वास्तव में एक निष्पक्ष तुलना नहीं है यदि आप एक मामले में बूल को डालते हैं और दूसरे मामले में नहीं ... दोनों मामलों में बूल को डाली जाती है जो इसे काम करेगी, और यह नाजुक क्यों है (क्योंकि आपको इसे याद रखना होगा)।
ग्रेग रोजर्स

शॉर्ट-सर्कुलेटिंग की व्याख्या यह है कि यह बिल्कुल स्वीकृत उत्तर क्यों होना चाहिए; पैट्रिक का जवाब (इरेटी ... अन्य पैट्रिक, जिसे अभी पैट्रिक नाम दिया गया है) यह कहने में पूरी तरह से गलत है "जब आपके द्वारा संचालित संख्याओं का डोमेन सिर्फ 1 और 0 है, तो वे बिल्कुल समान हैं"
कोडेटाकु

13

मुझे लगता है

a != b

तुम क्या चाहते हो


1
यह सच है, +1। लेकिन इस ऑपरेटर का कोई असाइन करने वाला संस्करण नहीं है ( !==इसलिए बोलने के लिए) इसलिए यदि आप boolमूल्यों के अनुक्रम के XOR की गणना कर रहे हैं तो आपको acc = acc!= condition(i);लूप बॉडी में लिखना होगा । संकलक संभवतः इसे कुशलता से मानो !==अस्तित्व में है, लेकिन कुछ को लग सकता है कि यह अच्छा नहीं लगता है, और पूर्णांक के रूप में बूलियन को जोड़ने के विकल्प को पसंद करते हैं, और फिर यह परीक्षण करते हैं कि योग विषम है या नहीं।
मार्क वैन लीउवेन

10

उभरी हुई भौहें आपको इसे करने से रोकने के लिए पर्याप्त बताएंगी। आप संकलक के लिए कोड नहीं लिखते हैं, आप इसे अपने साथी प्रोग्रामर के लिए पहले और फिर संकलक के लिए लिखते हैं। यहां तक ​​कि अगर कंपाइलर काम करते हैं, तो आश्चर्यजनक रूप से अन्य लोग वह नहीं हैं जो आप चाहते हैं - बिटवाइज़ ऑपरेटर बिट्स के लिए बिट संचालन के लिए हैं।
मुझे लगता है कि आप भी कांटे के साथ सेब खाते हैं? यह काम करता है लेकिन यह लोगों को आश्चर्यचकित करता है इसलिए ऐसा न करना बेहतर है।


3
हां, यह शीर्ष उत्तर होना चाहिए। कम से कम आश्चर्य के सिद्धांत का पालन करें। कोड जो असामान्य चीजें करता है वह पढ़ने और समझने के लिए कठिन है, और कोड को जितना लिखा जाता है उससे कहीं अधिक बार पढ़ा जाता है। इस तरह से cutesy ट्रिक्स का उपयोग न करें।
एलॉफ

1
मैं यहाँ हूँ क्योंकि मेरे सहयोगी ने बिटवाइज़ का इस्तेमाल किया "और" बूल के लिए ऑपरेटर। और अब मैं यह समझने के लिए अपना समय बिता रहा हूं कि यह सही है या नहीं। अगर उसने ऐसा नहीं किया तो मैं अब कुछ और उपयोगी काम करूंगा। यदि आप अपने सहयोगियों के समय का मूल्य रखते हैं, तो कृपया बूल के लिए बिटवाइज़ ऑपरेटरों का उपयोग न करें!
anton_rh

9

बिटलेवल ऑपरेटरों का नुकसान।

तुम पूछो:

"ऐसा कोई कारण बिटवाइज़ ऑपरेटर्स का उपयोग नहीं है &, |और ^सी में bool" मूल्यों ++ के लिए "? ”

हां, लॉजिकल ऑपरेटर्स , जो बिल्ट-इन उच्च स्तरीय बुलियन ऑपरेटर हैं !, &&और ||, निम्नलिखित लाभ प्रदान करते हैं:

  • गारंटी तर्कों के रूपांतरण के लिए boolकरने के लिए, यानी 0और 1क्रमसूचक मूल्य।

  • अंतिम परिणाम ज्ञात होते ही शॉर्ट सर्किट मूल्यांकन की गारंटी जहां अभिव्यक्ति मूल्यांकन बंद हो जाता है।
    इसे ट्री-वैल्यू लॉजिक के रूप में व्याख्या की जा सकती है, जिसमें ट्रू , फाल्स और इंडिर्मनेट है

  • पठनीय पाठ समतुल्य not, andऔर or, भले ही मैं उन्हें खुद का उपयोग नहीं करता।
    एक टिप्पणी में पाठक एंटीमनी नोट्स भी bitlevel ऑपरेटरों विकल्प टोकन राशि के रूप में अर्थात् bitand, bitor, xorऔर compl, लेकिन मेरी राय में इन से भी कम समय पढ़े जाने योग्य हैं and, orऔर not

सीधे शब्दों में कहें, तो उच्च स्तरीय ऑपरेटरों का प्रत्येक लाभ बिटवेल ऑपरेटरों का नुकसान है।

विशेष रूप से, चूंकि बिटकॉइन ऑपरेटरों को तर्क रूपांतरण की कमी होती है 0/1 पर आपको उदाहरण मिलता है 1 & 20, जबकि 1 && 2true। इसके अलावा ^, बिटवाइस एक्सक्लूसिव या, इस तरह से दुर्व्यवहार कर सकता है। बूलियन मूल्यों के रूप में माना जाता है 1 और 2 एक ही हैं, अर्थात् true, लेकिन बिटपैटन के रूप में माना जाता है कि वे अलग हैं।


कैसे तार्किक व्यक्त करने के लिए / या C ++ में।

आप प्रश्न के लिए पृष्ठभूमि की एक बिट प्रदान करते हैं,

"मैं कभी-कभी उन स्थितियों में भाग लेता हूं जहां मैं चाहता हूं कि दो स्थितियों में से एक सही हो (XOR), इसलिए मैं सिर्फ ^ ऑपरेटर को सशर्त अभिव्यक्ति में फेंक देता हूं।"

वैसे, तार्किक ऑपरेटरों की तुलना में बिटवाइज़ ऑपरेटरों की उच्च प्राथमिकता होती है। इसका मतलब है कि विशेष रूप से मिश्रित अभिव्यक्ति में

a && b ^ c

आपको शायद अप्रत्याशित परिणाम मिले a && (b ^ c)

इसके बजाय बस लिखें

(a && b) != c

अधिक स्पष्ट रूप से व्यक्त करने का क्या मतलब है।

एकाधिक तर्क के लिए / या कोई C ++ ऑपरेटर नहीं है जो काम करता है। उदाहरण के लिए, यदि आप लिखते हैं a ^ b ^ cतो यह एक अभिव्यक्ति नहीं है जो कहती है "या तो a, bया cसच है"। इसके बजाय यह कहता है, "एक विषम संख्या a, bऔर cसच है", जो उनमें से 1 या सभी 3 हो सकता है ...

सामान्य को या तो व्यक्त करने के लिए / या कब a, bऔर cप्रकार के हैं bool, बस लिखें

(a + b + c) == 1

या, गैर- boolतर्कों के साथ , उन्हें इसमें कनवर्ट करें bool:

(!!a + !!b + !!c) == 1


&=बूलियन परिणाम जमा करने के लिए उपयोग करना ।

आप आगे बताते हैं,

"मैं भी कभी कभी बूलियन मान जमा करने के लिए की जरूरत है, और &=और |=?बहुत उपयोगी हो सकता है।"

खैर, यह जाँच करने के लिए मेल खाती है कि क्या क्रमशः सभी या किसी भी स्थिति से संतुष्ट हैं, और डी मॉर्गन का कानून आपको बताता है कि एक से दूसरे में कैसे जाना है। यानी आपको केवल उनमें से एक की जरूरत है। आप *=एक सिद्धांतकार के रूप में उपयोग कर सकते हैं &&=(अच्छे पुराने जॉर्ज बोले की खोज के लिए, तार्किक और बहुत आसानी से गुणन के रूप में व्यक्त किया जा सकता है), लेकिन मुझे लगता है कि वह कोड के प्रति चिंतित और शायद गुमराह करेगा।

इस पर भी विचार करें:

struct Bool
{
    bool    value;

    void operator&=( bool const v ) { value = value && v; }
    operator bool() const { return value; }
};

#include <iostream>

int main()
{
    using namespace std;

    Bool a  = {true};
    a &= true || false;
    a &= 1234;
    cout << boolalpha << a << endl;

    bool b = {true};
    b &= true || false;
    b &= 1234;
    cout << boolalpha << b << endl;
}

दृश्य C ++ 11.0 और g ++ 4.7.1 के साथ आउटपुट:

सच
असत्य

परिणामों में अंतर का कारण यह है कि बिटवेल अपने दाएं हाथ के तर्क में &=रूपांतरण प्रदान नहीं करता boolहै।

तो, आप इन परिणामों में से किसके उपयोग की इच्छा रखते हैं &=?

यदि पूर्व, trueतब बेहतर रूप से एक ऑपरेटर (जैसे ऊपर) या नामित फ़ंक्शन को परिभाषित करता है, या दाहिने हाथ की ओर अभिव्यक्ति का एक स्पष्ट रूपांतरण का उपयोग करता है, या पूर्ण में अपडेट लिखता है।


बिटवाइज़ ऑपरेटरों के पास पाठ समकक्ष भी हैं
एंटिमोनी

@Antimony: मैं पहली बार में उस टिप्पणी समझ में नहीं आया लेकिन हां, bitlevel संचालन विकल्प टोकन होने bitand, bitor, xorऔर compl। मुझे लगता है कि इसीलिए मैंने योग्यता "पठनीय" का उपयोग किया। बेशक, उदाहरण के compl 42लिए पठनीय व्यक्तिपरक है। ;-)
चीयर्स और एचटीटी। - अल्फ

जहां तक ​​मैं बता सकता हूं कि तार्किक ऑपरेटरों को अन्य तर्क प्रकारों के साथ ओवरलोड किया जा सकता है (हालांकि वे आम तौर पर नहीं होते हैं), इसलिए पहला बिंदु "दलीलों के लिए रूपांतरण की गारंटी bool" केवल कन्वेंशन का परिणाम है, न कि गारंटी कि सी ++ भाषा वास्तव में देता है आप।
मार्क वैन लीउवेन

@MarcvanLeeuwen: संभवतः आपका दृश्य सबसिस्टम "बिल्ट-इन उच्च बूलियन ऑपरेटर; && और ||" नोटिस करने में विफल रहा। आप सही कह रहे हैं कि ये ऑपरेटर अतिभारित हो सकते हैं, और फिर एक मुख्य समस्या यह है कि शब्दार्थ सूक्ष्म रूप से बदलते हैं, अब शॉर्ट सर्किट मूल्यांकन नहीं है। लेकिन यह ओवरलोड के साथ एक समस्या है, बिल्ट-इन ऑपरेटरों के साथ नहीं।
चीयर्स एंड हीथ। - अल्फ

यह सही है (मैंने ऐसा नहीं किया)। लेकिन तब बयान अभी भी भ्रामक है, क्योंकि आप सिर्फ यह कह रहे हैं कि वे ऑपरेटर बूलियन तर्क देते हैं; यदि (और केवल यदि) ऑपरेटरों के अंतर्निहित संस्करणों का चयन किया जाता है, तो संकलक ने तर्कों का रूपांतरण डाला होगा। इसी तरह अंतर्निहित (उच्च स्तर) अहस्ताक्षरित पूर्णांक जोड़ ऑपरेटर +अपने तर्कों के रूपांतरण की गारंटी देता है unsigned, लेकिन यह unsigned int n=-1; n+=3.14;वास्तव में double(या यह float?) अतिरिक्त संचालन का उपयोग करने से नहीं रोकता है । (अपने &=उदाहरण की तुलना करें ।)
मार्क वैन लीउवेन

3

पैट्रिक के जवाब के विपरीत, C ++ में ^^शॉर्ट-सर्कुलेटिंग एक्सक्लूसिव या प्रदर्शन के लिए कोई ऑपरेटर नहीं है । यदि आप इसके बारे में एक दूसरे के बारे में सोचते हैं, तो ^^ऑपरेटर होने का कोई मतलब नहीं होगा: विशेष रूप से या, परिणाम हमेशा दोनों ऑपरेंड पर निर्भर करता है। हालांकि, गैर- bool"बुलियन" प्रकार के बारे में पैट्रिक की चेतावनी की तुलना करते समय समान रूप से अच्छी तरह से रखती 1 & 2है 1 && 2। इसका एक क्लासिक उदाहरण विंडोज GetMessage()फ़ंक्शन है, जो एक त्रिकोणीय स्थिति लौटाता है BOOL: नॉनज़रो 0, या -1

के &बजाय &&और के |बजाय का उपयोग करना ||एक असामान्य टाइपो नहीं है, इसलिए यदि आप जानबूझकर ऐसा कर रहे हैं, तो यह टिप्पणी के योग्य है कि क्यों।


6
^^शॉर्ट-सर्किट विचार के बावजूद एक ऑपरेटर उपयोगी होगा। यह एक) बूलियन संदर्भ में बी का मूल्यांकन करेगा और बी) 1 या 0.
क्रेग मैकक्वीन

@ क्रेगमक्यूक्यूएन। यह परिभाषित करना inline bool XOR(bool a,bool b) { return a!=b; }और जो आप चाहते हैं उसे प्राप्त करना सरल है , सिवाय इसके कि यह एक (इन्फिक्स) ऑपरेटर के बजाय एक फ़ंक्शन है। या आप !=इस अर्थ के साथ किसी अन्य ऑपरेटर को सीधे उपयोग या ओवरलोड कर सकते हैं , लेकिन फिर निश्चित रूप से आपको उसी नाम के अनपेक्षित अधिभार का उपयोग करके गलती से समाप्त न होने के लिए बहुत सावधान रहने की आवश्यकता है। और संयोग से ||और &&वापस trueया false, 1या नहीं 0
मार्क वैन लीउवेन ने

और ऐसा लगता है कि तथ्य यह है कि !, ||और &&एक बूलियन संदर्भ में उनके तर्कों का मूल्यांकन केवल इसलिए है क्योंकि इन ऑपरेटरों को शायद ही कभी किसी भी प्रकार को स्वीकार करने के लिए अतिभारित किया जाता है; जहाँ तक मैं बता सकता हूँ कि भाषा ऐसे अधिभार की अनुमति देती है, और इसलिए एक बूलियन संदर्भ में तर्कों के मूल्यांकन की गारंटी नहीं है।
मार्क वैन लीउवेन

2

पैट्रिक ने अच्छे अंक बनाए, और मैं उन्हें दोहराने नहीं जा रहा हूं। हालाँकि, मैं अच्छी तरह से नामित बूलियन vars का उपयोग करके जहाँ भी संभव हो, अंग्रेजी में पठनीय अंग्रेजी के लिए 'if' स्टेटमेंट्स को कम करने का सुझाव दे सकता हूं। उदाहरण के लिए, और यह बूलियन ऑपरेटरों का उपयोग कर रहा है, लेकिन आप समान रूप से बिटवाइज़ का उपयोग कर सकते हैं और बूल को उचित रूप से नाम दे सकते हैं:

bool onlyAIsTrue = (a && !b); // you could use bitwise XOR here
bool onlyBIsTrue = (b && !a); // and not need this second line
if (onlyAIsTrue || onlyBIsTrue)
{
 .. stuff ..
}

आप सोच सकते हैं कि बूलियन का उपयोग करना अनावश्यक लगता है, लेकिन यह दो मुख्य चीजों के साथ मदद करता है:

  • आपका कोड समझना आसान है क्योंकि 'अगर' स्थिति के लिए मध्यवर्ती बूलियन स्थिति के इरादे को और अधिक स्पष्ट करता है।
  • यदि आप गैर-मानक या अप्रत्याशित कोड का उपयोग कर रहे हैं, जैसे कि बूलियन मूल्यों पर बिटवाइज़ ऑपरेटर, तो लोग बहुत आसानी से देख सकते हैं कि आपने ऐसा क्यों किया है।

संपादित करें: आपने स्पष्ट रूप से कहा था कि आप 'यदि' कथनों के लिए सशर्तियां चाहते हैं (हालांकि यह सबसे अधिक संभावना है), यह मेरी धारणा थी। लेकिन एक मध्यवर्ती बूलियन मूल्य का मेरा सुझाव अभी भी खड़ा है।


1

बूल के लिए बिटवाइज़ संचालन का उपयोग करना प्रोसेसर द्वारा अनावश्यक शाखा भविष्यवाणी तर्क को बचाने में मदद करता है, जिसके परिणामस्वरूप तार्किक संचालन द्वारा लाया गया 'सीएमपी' निर्देश होता है।

बिटवाइज़ ऑपरेशंस (जहाँ सभी ऑपरेंड बूल हैं) के साथ लॉजिकल को बदलना समान परिणाम देने वाले अधिक कुशल कोड उत्पन्न करता है। दक्षता आदर्श रूप से उन सभी शॉर्ट-सर्किट लाभों से आगे निकल जानी चाहिए जो तार्किक संचालन का उपयोग करके ऑर्डर में लीवरेज किए जा सकते हैं।

यह कोड को थोड़ा अन-पठनीय बना सकता है, यद्यपि प्रोग्रामर को इसे ऐसा करने के कारणों के साथ टिप्पणी करनी चाहिए।


0

IIRC, कई C ++ कंपाइलर एक बूल के रूप में बिटवाइज़ ऑपरेशन के परिणाम को डालने का प्रयास करते समय चेतावनी देंगे। कंपाइलर को खुश करने के लिए आपको एक प्रकार की कास्ट का उपयोग करना होगा।

अगर एक अभिव्यक्ति में बिटवाइज़ ऑपरेशन का उपयोग किया जाता है, तो वह उसी आलोचना को पूरा करेगा, हालांकि शायद संकलक द्वारा नहीं। किसी भी गैर-शून्य मूल्य को सच माना जाता है, इसलिए "अगर (7 और 3)" कुछ सच होगा। यह व्यवहार पर्ल में स्वीकार्य हो सकता है, लेकिन C / C ++ बहुत स्पष्ट भाषाएं हैं। मुझे लगता है कि स्पोक आइब्रो काफी मेहनती है। :) मैं इसे "== 0" या "! = 0" में जोड़ दूंगा ताकि यह स्पष्ट हो सके कि आपका उद्देश्य क्या था।

लेकिन वैसे भी, यह एक व्यक्तिगत प्राथमिकता की तरह लगता है। मैं एक प्रकार का वृक्ष या इसी तरह के उपकरण के माध्यम से कोड चलाऊंगा और देखूंगा कि क्या यह सोचता है कि यह एक नासमझी की रणनीति है। व्यक्तिगत रूप से, यह एक कोडिंग गलती की तरह पढ़ता है।


आपकी पोस्ट ने मुझे यह परीक्षण करने के लिए प्रेरित किया और जीसीसी ने चेतावनी नहीं दी! Bummer, क्योंकि मैं उस चेतावनी का उपयोग करने जा रहा था, जिससे मुझे चलाने के लिए = = बूल परिणाम जमा करने का औचित्य सिद्ध हो गया था, यह विश्वास करते हुए कि यदि वे बाद में मेरे परीक्षण को बदलते हैं तो अन्य लोग चेतावनी को देखेंगे। मेरा कोड पूर्णांक के लिए भी विफल होगा, क्योंकि वे चेतावनी के बिना 0 / गलत - का मूल्यांकन करते हैं! प्रतिक्षेपक का समय ...
ऋषि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.