2011-11-20 12 views
11

हाय सब मैं जावा स्रोत कोड के कुछ के माध्यम से ब्राउज़िंग गया था जब मैं इस में आए (java.lang.Character):char_x <(char_y + 1) == char_x <= char_y?

public static boolean isHighSurrogate(char ch) { 
    return ch >= MIN_HIGH_SURROGATE && ch < (MAX_HIGH_SURROGATE + 1); 
} 

public static boolean isLowSurrogate(char ch) { 
    return ch >= MIN_LOW_SURROGATE && ch < (MAX_LOW_SURROGATE + 1); 
} 

मैं सोच रहा था क्यों किया था लेखक उच्च सीमा को 1 जोड़ा गया है और कर रही एक तुलना कम से , बस कम से कम या बराबर तुलना करने की बजाय?

मैं समझ सकता हूं कि क्या यह पठनीयता में मदद करता है, लेकिन इस मामले में ऐसा लगता है कि ऐसा नहीं लगता है।

मैं सोच रहा था क्या इसके बाद के संस्करण कोड और इस बीच क्या अंतर है:

public static boolean isHighSurrogate(char ch) { 
    return ch >= MIN_HIGH_SURROGATE && ch <= MAX_HIGH_SURROGATE; 
} 

public static boolean isLowSurrogate(char ch) { 
    return ch >= MIN_LOW_SURROGATE && ch <= MAX_LOW_SURROGATE; 
} 
+0

यह एक अनुमान है, जवाब नहीं: शायद यह लूप के लिए लिखने के बेवकूफ तरीके से संगत होना है, उदाहरण के लिए 'के लिए (i = LOWER_BOUND; i

+0

शायद यह जोर देने के लिए था कि ch ch MAX_ [HIGH | LOW] _SURROGATE के बराबर भी हो सकता है। "<=" को "<" के रूप में गलत तरीके से पढ़ना आसान है - और संकलक शायद इसे उसी बाइटकोड पर अनुकूलित करता है। –

+2

ठीक है, एक चीज़ के लिए, 'MAX_HIGH_SURROGATE' एक char है और '1' एक int है ... वहां से चार से int तक कुछ प्रकार का रूपांतरण हो सकता है जो आवश्यक हो सकता है। – BoltClock

उत्तर

2

शायद लेखक सभी आधा खुला पर्वतमाला बनाने के लिए Dijkstra's advice के अनुरूप होना करने के लिए कोशिश कर रहा है - प्रारंभ बिंदु समावेशी है और एंडपॉइंट अनन्य है।

यहां कोई अर्थ अंतर है, लेकिन बाईटकोड में एक सूक्ष्म अंतर है: (ch + 1) एक int तो पहले कोड स्निपेट एक charchar की तुलना जबकि दूसरा दो charchar की तुलना करता है एक intint की तुलना द्वारा पीछा करता है। इससे कोई अर्थपूर्ण अंतर नहीं होता है - निहित कास्ट व्यापक प्रकार के होते हैं और इसलिए कोड स्निपेट में अतिप्रवाह का कोई जोखिम नहीं होता है।

बाहर इसके JIT द्वारा किया अनुकूलन के प्रकार के दायरे के भीतर अच्छी तरह से अनुकूलन और intint की तुलना एक 2 बाइट अहस्ताक्षरित int तुलना में वापस परिवर्तित तो मैं एक को पसंद करते हैं किसी विशेष प्रदर्शन कारण नहीं दिख रहा है दूसरे पर

मैं के रूप में

MIN_LOW_SURROGATE <= ch && ch <= MAX_LOW_SURROGATE 

बात इस तरह का लिखने के लिए करते हैं कि जिस तरह से बीच में ch यह एक पाठक है कि ch बाहरी मूल्यों की सीमा के भीतर परीक्षण किया जा रहा है के लिए स्पष्ट कर देता है।

+0

मैंने सोचा था कि अगर वह दोनों तरफ से समान तुलना करता है तो यह अधिक समझ में आता होगा: 'ch> = (MIN_HIGH_SURROGATE + 0) && ch <(MAX_HIGH_SURROGATE + 1)' – Pacerier

+0

@Pacerier, कहने के कई अलग-अलग तरीके हैं वही चीज़। मैं जो कुछ भी अंडरफ्लो/ओवरफ्लो बनाता हूं और ऑफ-बाय -1 त्रुटियां आपके सामने खड़ा होता हूं और इसके साथ चिपक जाता हूं। –

0

मैं कहूंगा कि कोडिंग के दो तरीकों के बीच वास्तव में कोई अंतर नहीं है, यह केवल स्वाद का मामला है जो आप पसंद करेंगे, क्योंकि आपके पास वास्तव में दो अलग-अलग कार्यान्वयनों में से कोई एक लाभ नहीं है।

मैं सोच रहा था कि लेखक ने उच्च सीमा तक 1 क्यों जोड़ा और कम से कम या बराबर तुलना करने की बजाय तुलना करने से कम से कम किया?

मेरा मतलब है, आप दूसरी पसंद क्यों पसंद करेंगे? क्या मुझे यहाँ कुछ याद आती है?

+0

मेरा मतलब है कि दूसरा विकल्प आपके लिए अधिक पठनीय नहीं है (अधिक तार्किक अर्थ बनाता है)? – Pacerier

+0

नहीं, वास्तव में ऐसा नहीं है क्योंकि मैं MAX और MIN और + 1 के बीच कम से कम 1 के अंतर की अपेक्षा करता हूं, यह मेरे लिए बाहर लाता है, लेकिन यह सिर्फ मेरे पीओवी है। – philomatic

-1

क्योंकि लेखक एक सी ++ या एक असेंबलर लड़का था।

यह>> से>> बनाने के लिए तेज़ है और यह < = < से तेज़ है। असल में, जब आप < बी लिखते हैं तो संकलक < = बी + 1 बनाता है, इसलिए यह एक अतिरिक्त और तुलना करता है, क्योंकि केवल उपलब्ध असेंबली निर्देश < = करता है। यदि आप हाथ में कोड में उस योग को लिखते हैं, तो एक सी ++ कंपाइलर संकलन समय पर परिणाम के वास्तविक मूल्य के साथ MIN_HIGH_SURROGATE + 1 बदल देगा। तो आप एक निर्देश, और एक चक्र प्राप्त करते हैं।

लेकिन यह सब अजीब तर्क केवल संकलित कोड के लिए आवेदन कर रहा है, जैसे सी ++ या सी या एएसएम।

संपादित

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

यह सुनिश्चित करने के लिए कि 1 जोड़ते समय कोई ओवरफ़्लो नहीं है, माइक्रोप्रोसेसर पहले घटाता है, फिर एक जोड़ता है।

+0

उस तर्क से, यदि 'b' MAX_VALUE है, तो इसका अर्थ यह नहीं होगा कि 'a Pacerier

+0

आपको यह सुनिश्चित करना होगा कि ऐसा नहीं होता है। यह प्रोग्रामर का काम है। – Sam

+0

x86 पर, कम से कम, '<=' और '<' के लिए निर्देश हैं। जावा बाइटकोड के लिए ही। न तो दूसरे की तुलना में तेज़ होना चाहिए। नतीजतन, मुझे संदेह है कि संकलक एक दूसरे को परिवर्तित करता है। –

2

जंगली अनुमान

सरोगेट चरित्र, यूनिकोड कोड पॉइंट्स जो बेसिक बहुभाषी विमान परे केरेक्टर को अभिव्यक्त करने UTF-16 में जोड़े में उपयोग किया जाता है की एक श्रृंखला के किसी भी।

मेरे दृष्टिकोण में वह 8 बिट सामानों को अनदेखा करना चाहता था, जिसका अर्थ है कि अधिकतम 0xFF था। 0xFF + 1 बह जाएगा और 0x00 पर वापस जायेगा। तुलना हमेशा झूठी बनाते हैं।

तो यदि कोड 8 बिट्स के वर्णों के साथ संकलित किया गया था। यह हमेशा झूठी (यूटीएफ -16 रेंज के बाहर) लौटाएगा, जबकि अगर यह एक छत को संकलित करता है> 8 बिट्स 0xFF + 1 0x100 होगा और अभी भी काम करेगा।

उम्मीद है कि यह आपके लिए कुछ बाधा बनाता है।

+0

'char' हमेशा जावा में एक हस्ताक्षरित 16-बिट पूर्णांक होता है। अधिकतम 0xDBFF है और न्यूनतम 0xD800 है। –

संबंधित मुद्दे