तार्किक ऑपरेटरों के लिखित संस्करण


94

यह एकमात्र ऐसी जगह है जिसे मैंने कभी देखा हैand , orऔर notसी ++ में वास्तविक ऑपरेटरों के रूप में सूचीबद्ध किया है। जब मैंने नेटबीन्स में एक परीक्षण कार्यक्रम लिखा था, तो मुझे लाल अंडरलाइनिंग मिली जैसे कि एक सिंटैक्स त्रुटि थी और लगा कि वेबसाइट गलत थी, लेकिन यह नेटबींस है जो गलत है क्योंकि यह उम्मीद के मुताबिक संकलित और भागा है।

मुझे इसके !पक्ष में देखा जा सकता है notलेकिन and&& की पठनीयता orउनके व्याकरणिक भाइयों से अधिक प्रतीत होती है। तार्किक ऑपरेटरों के ये संस्करण क्यों मौजूद हैं और प्रतीत होता है कि कोई इसका उपयोग क्यों नहीं करता है? क्या यह वास्तव में वैध सी ++ या सी के साथ किसी प्रकार की संगतता है जो भाषा के साथ शामिल थी?


4
\ _ मुझे उसके सभी कोड
सीमित प्रायश्चित

2
"क्लीन कोड" की भावना में, मैं व्यक्तिगत रूप से लिखने की आदत से दूर रहने की सलाह दूंगा ||और &&शायद !कई बार। शब्द हमेशा बेहतर होते हैं फिर "लाइन शोर", बिट हेरफेर ऑपरेटरों के साथ संभावित भ्रम का उल्लेख नहीं करना।
इचथियो

2
@ आईच्यो हमेशा सही नहीं होता है। बहुत सारे प्रतीकों को पढ़ने के बजाय, बहुत सारे प्रतीकों को पढ़ना और उनका अर्थ जानना तेजी से आसान है।
vallentin

एक मानव पाठक के लिए जो स्पष्ट है वह "गेस्टाल्ट" पर निर्भर करता है। कभी-कभी एक प्रतीक कुछ गड़बड़ शब्द की तुलना में स्पष्ट हो सकता है, लेकिन इस मामले में ऐसा नहीं है। और, अंग्रेजी भाषा के सरल शब्द कुछ अजीब प्रोग्रामिंग भाषा के कुछ अजीब विशेष प्रतीकों की तुलना में अधिक सार्वभौमिक हैं ...
इचथियो

3
यह कहने की विडंबना कि andअधिक पठनीय है और फिर " and&& or" लिखना हालांकि :)
इवान वरगिलिव

जवाबों:


111

वे हेडर में सी में उत्पन्न हुए <iso646.h>। समय कीबोर्ड कि के लिए आवश्यक प्रतीकों टाइप नहीं कर सकता वहाँ थे &&(उदाहरण के लिए), तो हैडर निहित #define'कि उन्हें (हमारे उदाहरण में) ऐसा करने से, द्वारा परिभाषित करने में सहायता करेगा andहोने के लिए &&। बेशक, जैसे-जैसे समय बीतता गया यह कम इस्तेमाल होने लगा।

C ++ में, वे बन गए जिन्हें वैकल्पिक टोकन के रूप में जाना जाता है । आपको इन कंपनों का उपयोग करने के लिए किसी कंपाइलर कंपाइलर में कुछ भी शामिल करने की आवश्यकता नहीं है (जैसे, C ++ - C हेडर का ified संस्करण <ciso646>, रिक्त है)। वैकल्पिक टोकन वर्तनी के अलावा नियमित टोकन की तरह हैं। तो दौरान पार्स andहै बिल्कुल के रूप में ही&& है, यह सिर्फ एक ही बात वर्तनी का एक अलग तरीका है।

उनके उपयोग के लिए: क्योंकि वे शायद ही कभी उपयोग किए जाते हैं, उनका उपयोग करना अक्सर अधिक आश्चर्यजनक और भ्रमित करने में मददगार होता है। मुझे यकीन है कि अगर यह सामान्य था, तो उन्हें पढ़ना बहुत आसान होगा, लेकिन लोगों को इसकी आदत होती है &&और ||कुछ भी बस विचलित हो जाता है।

संपादित करें: जब से मैंने यह पोस्ट किया है, मैंने उनके उपयोग में बहुत मामूली वृद्धि देखी है। मैं अब भी उनसे बचता हूं।


तो क्या इन वैकल्पिक टोकन की व्याख्या सिर्फ एक संकलक सुविधा है या क्या यह C ++ विनिर्देशन में है?
डिफेक्टिवल्ट

2
@Kavon: यह मानक के खंड 2.5 में निर्दिष्ट है; यह एक भाषा की विशेषता है।
GManNickG

15
मुझे व्यक्तिगत रूप से लगता है कि वे बहुत बेहतर हैं ... लेकिन फिर मैं पायथन का पक्षपाती हूं। मुझे नहीं पता कि कुछ लोग क्यों कहते हैं कि अगर यह नहीं हुआ है तो यह कोड नहीं है ...
Matthieu M.

तो ये उस हेडर फ़ाइल को शामिल किए बिना C में मान्य नहीं हैं? मुझे आश्चर्य है कि ये सभी द्वारा उपयोग नहीं किए जाते हैं; वे अजगर को इतना अधिक पठनीय बनाते हैं।
एंडोलिथ

1
कम से कम विज़ुअल स्टूडियो 2015 CTP 6 को हेडर शामिल किए बिना मेरा orया पसंद नहीं आया not
usr1234567

19

वे प्रयोज्य (कीबोर्ड / डिस्प्ले फ्लेवर में वर्ण समर्थन) और सामान्य पठनीयता के लिए मौजूद हैं, लेकिन एक और कारण है जो आजकल अधिक स्पष्ट है। लगभग कोई भी उत्तर यहाँ , यहाँ या यहाँ तक कि मुख्य उत्तर में से कोई भी नहींमुख्य कारण से बाहर हम में से कई प्रतीक संस्करणों पर शब्द संस्करण पसंद करते हैं (और एक मुख्य कारण अन्य भाषाएं उनका उपयोग करती हैं): कीड़े। शब्द संस्करणों के बीच अंतर बहुत दिखाई देता है। तुलनात्मक रूप से बगों को लुभाने के लिए प्रतीक संस्करणों के बीच का अंतर इतना कम है कि तुलनात्मक रूप से बहुत अधिक हद तक: "x | y" बहुत अधिक नहीं "x || y" है, फिर भी जब हम एक बड़ी अभिव्यक्ति में अंतर्निहित हैं। अंतर याद आती है। यह असाइनमेंट बनाम समानता ऑपरेटर के आम आकस्मिक मिश्रण के समान है। इस कारण से मैंने शब्द संस्करणों के पक्ष में खुद को प्रतीक संस्करणों से अलग कर लिया (यह आसान नहीं था)। बल्कि मैं किसी को उन पर पुरानी बातों के प्यार की वजह से उन पर एक डबल-लेना होगा।


4
दुर्भाग्य से, विज़ुअल स्टूडियो (VS2013 के रूप में), आपको /Zaवैकल्पिक कीवर्ड का समर्थन करने के लिए एक विशिष्ट संकलक विकल्प ( ) सेट करना होगा (देखें stackoverflow.com/a/555524/368896 )। संभवत: इसके अन्य प्रभाव भी हैं। इसलिए, विजुअल स्टूडियो में, यह सलाह लेना आवश्यक नहीं है।
दान निसानबाम

एफडब्ल्यूआईडब्ल्यू / - जैसा कि मैंने ऑपरेटरों के आसपास रिक्त स्थान डाल दिया है, x | yपर्याप्त दृष्टिगत रूप से अलग-अलग (मोनोपॉज किए गए फोंट में) है x || y, लेकिन मुझे लगता है कि !उदाहरण के if (!f(xyz) && ...लिए याद करने में आसान है if (not f(xyz) && ...
टोनी डेलरॉय

@ जब आप ऑपरेटरों के आसपास रिक्त स्थान डालते हैं, तो यह आपका निजी सम्मेलन है और पाठक के लिए स्पष्ट नहीं है। लेकिन प्राकृतिक भाषा के शब्दों का उपयोग करना and, orऔर notबूलियन अभिव्यक्ति में, वास्तव में पठनीयता में सुधार होता है और यह बिट जोड़तोड़ के भेद को उजागर करता है। इस प्रकार IMHO को हमें अपनी प्रिय पुरानी आदतों को बेहतर बनाने पर विचार करना चाहिए ...
इचथियो

@DanNissenbaum मुझे यह विकल्प C / C ++> Language> भाषा भाषा एक्सटेंशन के तहत मिला , इसलिए यह साइड इफेक्ट की उम्मीद करने के लिए अपेक्षाकृत सुरक्षित है;)
वुल्फ

6
क्या आप जानते हैं कि पायथन कीड़े कितने शुरू किए गए हैं क्योंकि शब्द andऔर orपूर्वाग्रह लोगों की सोच है कि उन्हें कैसे काम करना चाहिए? उदाहरण if (a == b or c)के लिए if (a == b || a == c)- स्टैकऑवरफ्लो में लगभग हर दिन इस तरह का कुछ पॉप अप होता है। अंग्रेजी भाषा से डिस्कनेक्ट किए गए सार प्रतीक इन त्रुटियों को कम करते हैं।
मार्क रैनसम

10

C ++ में, वे वास्तविक कीवर्ड हैं। सी में, वे मैक्रोज़ में परिभाषित हैं <iso646.h>Http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html देखें ।


6
तकनीकी रूप से वे वैकल्पिक टोकन हैं, कीवर्ड नहीं। :)
GManNickG

2
@GMan: +1 नाइस कॉल, हालांकि, Dinkumware पेज उन्हें कीवर्ड कहता है, इसलिए, मुझे लगता है कि वे भेद के बारे में बहुत ज्यादा परवाह नहीं करते थे।
क्रिस जस्टर-यंग


तो, क्या MSVC उन्हें C ++ में बॉक्स से बाहर का समर्थन करता है लेकिन C में नहीं?
rwst

1
@rwst मैं विशेष रूप से MSVC पर टिप्पणी नहीं कर सकता, लेकिन अगर यह C ++ और C मानकों को ईमानदारी से लागू करता है, तो वास्तव में यही होगा। इसे भी देखें: stackoverflow.com/questions/2376448/…
क्रिस जस्टर-यंग

2

andऔर &&कार्यात्मक रूप से C ++ में समान हैं। andऔर orऑपरेटरों वास्तव में वैध सी ++ और भाषा मानक का हिस्सा हैं।

एक ठोस उदाहरण के साथ अन्य उत्तरों के बारे में विस्तार से बताने के लिए, केवल "पठनीयता" के अलावा एक और कारण है कि इसे प्राथमिकता andदी जाए &&। स्पेलिंग आउट "और" स्पष्ट रूप से जब एक तार्किक और आप जो कहते हैं, वह सूक्ष्म कीड़े की संभावना को समाप्त करता है।

इस पर विचार करो:

int x = 3;
int y = 4;

// Explicitly use "and"
if (x and y) {
    cout << "and: x and y are both non-zero values" << endl;
}

// Using "&&"
if (x && y) {
    cout << "&&: x and y are both non-zero values" << endl;
}

// Oops! I meant to type "&&"!
if (x & y) {
    cout << "&: x and y are both non-zero values" << endl;
}
else {
    cout << "How did I get here?" << endl;
}

सभी तीन अगर बयान संकलित करेंगे, लेकिन अंतिम का मतलब पूरी तरह से अलग और अनपेक्षित कुछ है!

यदि आप हमेशा उपयोग करते हैं and तार्किक और मतलब होने पर करते हैं, तो आप कभी भी गलती से एक "और" टाइप नहीं कर सकते हैं और अपने कोड को सफलतापूर्वक संकलित करें और रहस्यमय परिणामों के साथ चलाएं।

एक और अच्छा व्यायाम: दुर्घटना से "और" का एक चरित्र छोड़ने की कोशिश करें और देखें कि क्या होता है। ;)


1
यह वास्तव में सवाल का जवाब नहीं है। यह सिर्फ यह है कि आप जो महसूस करते हैं वह अधिक सुपाठ्य है। ओपी ने पूछा कि लिखित संस्करण कैसे काम करते हैं, जो बेहतर नहीं हैं। और कोई और पहले से ही वही बिंदु बना रहा है जिसे आप बनाने की कोशिश कर रहे हैं।
निकोल बोलस

ऐसा नहीं है कि यह वास्तव में किसी भी अधिक उपयोगी जानकारी प्रदान करता है, लेकिन मैं "जोड़ दूंगा" andऔर &&कार्यात्मक रूप से समान हैं "उत्तर के लिए ... और यदि आप मेरा उत्तर पढ़ते हैं, तो आप देखेंगे कि मैं इसकी
उपयुक्तता के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.