C++ 14 अंक विभाजकों के लिए अंतरिक्ष वर्ण क्यों नहीं चुना गया?




language-lawyer c++14 (6)

C ++ 14 के अनुसार, n3781 के लिए धन्यवाद (जो अपने आप में इस प्रश्न का उत्तर नहीं देता है) हम निम्नलिखित की तरह कोड लिख सकते हैं:

const int x = 1'234; // one thousand two hundred and thirty four

उद्देश्य इस तरह कोड में सुधार करना है:

const int y = 100000000;

और इसे और अधिक पठनीय बनाते हैं।

अंडरस्कोर ( _ ) वर्ण पहले से ही C ++ 11 में उपयोगकर्ता द्वारा परिभाषित शाब्दिक रूप से लिया गया था, और अल्पविराम ( , ) में स्थानीयकरण की समस्याएं हैं - कई यूरोपीय देशों ने इसे ly दशमलव विभाजक के रूप में उपयोग किया है - और अल्पविराम ऑपरेटर के साथ टकराव, हालांकि मुझे आश्चर्य है कि वास्तविक दुनिया कोड संभवतः 1,234,567 अनुमति देकर तोड़ा जा सकता है।

वैसे भी, एक बेहतर समाधान अंतरिक्ष चरित्र प्रतीत होगा:

const int z = 1 000 000;

इन आसन्न सांख्यिक शाब्दिक टोकनों को प्रीप्रोसेसर द्वारा समाप्‍त किया जा सकता है जैसे कि स्ट्रिंग शाब्दिक हैं:

const char x[5] = "a" "bc" "d";

इसके बजाय, हम एपोस्ट्रोफ ( ' ) प्राप्त करते हैं, किसी भी लेखन प्रणाली द्वारा उपयोग नहीं किया जाता है जो मुझे एक अंक विभाजक के रूप में पता है।

क्या एक कारण है कि एपोस्ट्रोफ को एक साधारण स्थान के बजाय चुना गया था?

Text यह चौंकाने वाला है क्योंकि उन सभी भाषाओं में, पाठ के भीतर, एक अल्पविराम की धारणा को बनाए रखना "अलग करना" अन्यथा एक परमाणु वाक्य है, जो अवधि के साथ "वाक्य को" समाप्त करने के लिए कार्य करता है - मेरे लिए, कम से कम, यह काफी अनुरूप है अल्पविराम "तोड़कर अलग" एक संख्या का अभिन्न अंग और एक अवधि "समाप्त" यह भिन्नात्मक इनपुट के लिए तैयार है।


Answer #1

मैं यह मान सकता हूं क्योंकि कोड लिखते समय, यदि आप एक "लाइन" (आपकी स्क्रीन की चौड़ाई) के अंत तक पहुँचते हैं तो एक स्वचालित लाइन-ब्रेक (या "वर्ड रैप") होता है। इससे आपका इंट आधे में विभाजित हो जाएगा, इसका आधा हिस्सा पहली पंक्ति में होगा, दूसरा आधा दूसरे पर ... इस तरह यह सब एक word-wrap की स्थिति में एक साथ रहता है।


Answer #2

wiki , हमारे पास एक अच्छा उदाहरण है:

auto floating_point_literal = 0.000'015'3;

यहाँ, हमारे पास है . ऑपरेटर और फिर यदि कोई अन्य ऑपरेटर से मिलना होगा, तो मेरी आँखें किसी वस्तु या वस्तु की तरह दिखाई देंगी, न कि किसी गोरे की।

इसलिए व्हाट्सएप की तुलना में एक धर्मत्यागी यहां बहुत बेहतर करता है।

व्हॉट्सएप के साथ यह होगा

auto floating_point_literal = 0.000 015 3;

जो एपोस्ट्रोफिस के मामले में उतना सही नहीं लगता।

अल्बर्ट रेनशॉ के जवाब की इसी भावना में, मुझे लगता है कि ऑर्बिट प्रस्ताव में लाइटनेस दौड़ने की जगह की तुलना में एपोस्ट्रोफ अधिक स्पष्ट है।

type a = 1'000'000'000'000'000'544'445'555;
type a = 1 000 000 000 000 000 544 445 555;

अंतरिक्ष का उपयोग कई चीज़ों के लिए किया जाता है, जैसे कि तारांकनी ओपी उल्लेखों में, उदासीनता के विपरीत, जो इस मामले में किसी ऐसे व्यक्ति के लिए स्पष्ट करता है जिसका उपयोग अंकों को अलग करने के लिए किया जाता है।

जब कोड की लाइनें कई हो जाती हैं, तो मुझे लगता है कि यह पठनीयता में सुधार करेगा, लेकिन मुझे संदेह है कि यही कारण है कि वे इसे चुनते हैं।

रिक्त स्थान के बारे में, यह इस C question पर एक नज़र डालने के लायक है, जो कहता है:

भाषा int i = 10 000; अनुमति नहीं देती है int i = 10 000; (पूर्णांक शाब्दिक एक टोकन है, बीच में आने वाला व्हाट्सएप इसे दो टोकन में विभाजित करता है) लेकिन इनिशियलाइज़र को अभिव्यक्ति के रूप में व्यक्त करने से होने वाले खर्च की कोई सीमा नहीं होती है जो कि शाब्दिकों की गणना है:

int i = 10 * 1000; /* ten thousand */


Answer #3

एक पिछला पेपर है, n3499 , जो हमें बताता है कि हालांकि n3499 ने खुद को विभाजक के रूप में सुझाव दिया था:

जबकि यह दृष्टिकोण एक सामान्य टाइपोग्राफिक शैली के अनुरूप है, यह कुछ संगतता समस्याओं से ग्रस्त है।

  • यह एक पीपी-संख्या के लिए सिंटैक्स से मेल नहीं खाता है, और उस सिंटैक्स को निकालने के लिए न्यूनतम आवश्यकता होगी।
  • इससे भी महत्वपूर्ण बात यह है कि जब अंतरिक्ष में एक हेक्साडेसिमल अंक [af] एक स्थान का अनुसरण करता है, तो कुछ वाक्यात्मक अस्पष्टता होगी। प्रीप्रोसेसर को पता नहीं होगा कि अंतरिक्ष के बाद शुरू होने वाले प्रतीक प्रतिस्थापन प्रदर्शन करना है या नहीं।
  • यह संभवतः संपादन उपकरण बनाता है जो "शब्द" को कम विश्वसनीय पकड़ता है।

मुझे लगता है कि निम्नलिखित उदाहरण मुख्य समस्या है:

const int x = 0x123 a;

हालांकि मेरी राय में यह तर्क काफी कमजोर है। मैं अब भी इसे तोड़ने के लिए वास्तविक दुनिया के उदाहरण के बारे में नहीं सोच सकता।

"संपादन उपकरण" औचित्य और भी बदतर है, क्योंकि 1'234 मूल रूप से मानव जाति के लिए ज्ञात प्रत्येक वाक्यविन्यास हाइलाइटर को तोड़ता है (जैसे कि उपरोक्त प्रश्न में 1'234 द्वारा उपयोग किया जाता है!) और कार्यान्वित किए गए हाइपरर्स के अद्यतन संस्करणों को लागू करने के लिए बहुत कठिन बनाता है।

फिर भी, बेहतर या बदतर के लिए, यह तर्क है जिसके कारण एपोस्ट्रोफ्स को अपनाना पड़ा।


Answer #4
float floating_point_literal = 0.0000153;   /* C, C++*/

auto floating_point_literal = 0.0000153;    // C++11

auto floating_point_literal = 0.000'015'3;  // C++14

टिप्पणी करने से दुख नहीं होता:

/*  0. 0000 1530 */ 
float floating_point_literal = 0.00001530; 

बाइनरी स्ट्रिंग्स को पार्स करना मुश्किल हो सकता है:

long bytecode = 0b1111011010011001; /* gcc , clang */  

long bytecode = 0b1111'0110'1001'1001;  //C++14
// 0b 1111 0110 1001 1001  would be better, really.
// It is how humans think.

विचार के लिए एक मैक्रो:

#define B(W,X,Y,Z)    (0b##W##X##Y##Z)
#define HEX(W,X,Y,Z)  (0x##W##X##Y##Z)
#define OCT(O)        (0##O)



long z = B(1001, 1001, 1020, 1032 ); 

// result :  long z = (0b1001100110201032);

 long h = OCT( 35); 

// result :  long h  = (035); // 35_oct => 29_dec

 long h = HEX( FF, A6, 3B, D0 ); 

// result :  long h  = (0xFFA6BD0);

Answer #5

श्वेत स्थान का उपयोग नहीं करने का स्पष्ट कारण यह है कि एक नई रेखा भी श्वेत स्थान है, और यह कि C ++ सभी श्वेत स्थानों को पहचानता है। और हाथ से, मुझे किसी भी भाषा का पता नहीं है जो एक विभाजक के रूप में मनमाने ढंग से सफेद स्थान को स्वीकार करता है।

संभवतः, यूनिकोड 0xA0 (नॉन-ब्रेकिंग स्पेस) का उपयोग किया जा सकता है - टाइपिंग करते समय यह सबसे व्यापक रूप से उपयोग किया जाने वाला समाधान है। मुझे इसके साथ दो समस्याएं दिखाई देती हैं, हालांकि: पहला, यह मूल वर्ण सेट में नहीं है, और दूसरा, यह नेत्रहीन विशिष्ट नहीं है; आप यह नहीं देख सकते हैं कि यह केवल एक सामान्य संपादक में पाठ को देखकर एक स्थान नहीं है।

इसके अलावा, कई विकल्प नहीं हैं। आप कॉमा का उपयोग नहीं कर सकते, क्योंकि यह पहले से ही एक कानूनी टोकन है (और 1,234 की तरह कुछ वर्तमान में कानूनी सी ++ है, जिसका अर्थ 234 है)। और एक संदर्भ में जहां यह कानूनी कोड में हो सकता है, उदाहरण के a[1,234] । हालांकि मैं वास्तव में इसका उपयोग करने वाले किसी भी वास्तविक कोड की कल्पना नहीं कर सकता हूं, एक बुनियादी नियम है कि कोई भी कानूनी कार्यक्रम नहीं है, चाहे वह कितना भी बेतुका हो, चुपचाप शब्दार्थ को बदलना चाहिए।

इसी तरह के विचारों का अर्थ है कि _ उपयोग नहीं किया जा सकता है; अगर कोई #define _234 * 2 , तो a[1_234] चुपचाप कोड का अर्थ बदल देगा।

मैं यह नहीं कह सकता कि मैं ' की पसंद से विशेष रूप से प्रसन्न हूं, लेकिन महाद्वीपीय यूरोप में, कम से कम कुछ प्रकार के ग्रंथों में इसका उपयोग करने का फायदा है। (मुझे यह याद है कि यह जर्मन में देखा गया था, उदाहरण के लिए, हालांकि, सामान्य रूप से चलने वाले पाठ में, अधिकांश अन्य भाषाओं की तरह, जर्मन एक बिंदु या गैर-ब्रेकिंग स्पेस का उपयोग करेगा। लेकिन शायद यह स्विस जर्मन था।) के साथ समस्या ' पार्स; अनुक्रम '1' पहले से ही कानूनी है, जैसा कि '123' । तो 1'234 जैसा कुछ एक चरित्र के शुरू होने के बाद एक 1 हो सकता है; मुझे यकीन नहीं है कि आपको निर्णय लेने के लिए कितनी दूर देखना होगा। कानूनी C ++ का कोई अनुक्रम नहीं है जिसमें एक अभिन्न निरंतर एक चरित्र निरंतर द्वारा पीछा किया जा सकता है, इसलिए कानूनी कोड को तोड़ने के साथ कोई समस्या नहीं है, लेकिन इसका मतलब है कि लेक्सिकल स्कैनिंग अचानक बहुत संदर्भ पर निर्भर हो जाती है।

(आपकी टिप्पणी के संबंध में: दशमलव या हजारों विभाजक की पसंद में कोई तर्क नहीं है। उदाहरण के लिए, एक दशमलव विभाजक, निश्चित रूप से पूर्ण विराम नहीं है। वे केवल मनमाना सम्मेलन हैं।)


Answer #6

यह सच है कि मुझे इसका कोई व्यावहारिक अर्थ नहीं दिखता है:

if (a == 1 1 1 1 1) ...

तो अंकों को वास्तविक अस्पष्टता के बिना विलय किया जा सकता है लेकिन हेक्साडेसिमल संख्या के बारे में क्या?

0 x 1 a B 2 3

ऐसा करने के लिए टाइपो से अलग करने का कोई तरीका नहीं है (आम तौर पर हमें एक त्रुटि दिखनी चाहिए)





digit