এই সি কোডে বর্ণমালা একাধিক ব্যাপ্তিতে বিভক্ত হবে কেন?


161

একটি কাস্টম লাইব্রেরিতে আমি একটি বাস্তবায়ন দেখেছি:

inline int is_upper_alpha(char chValue)
{
    if (((chValue >= 'A') && (chValue <= 'I')) ||
        ((chValue >= 'J') && (chValue <= 'R')) ||
        ((chValue >= 'S') && (chValue <= 'Z')))
        return 1;
    return 0;
}

এটি কি একটি ইস্টার ডিম বা মান সি / সি ++ পদ্ধতি বনাম সুবিধাগুলি কী?

inline int is_upper_alpha(char chValue)
{
    return ((chValue >= 'A') && (chValue <= 'Z'));
}

নোট করুন যে EBCDIC- তে, ছোট-বড় অক্ষরের অক্ষরের ব্যাপ্তি বড় হাতের অক্ষরের জন্য অক্ষরের ব্যাপ্তির আগে আসে, এবং উভয়ই অঙ্কগুলির আগে আসে - যা ASCII- ভিত্তিক এনকোডিংগুলিতে আদেশের বিপরীত (যেমন 8859- এক্স সিরিজ, বা ইউনিকোড, বা সিপি 1252 বা…)।
জোনাথন লেফলার

1
দ্রষ্টব্য: যদি 'J' - 'I'এবং 'S' - 'R'উভয়ই সমান হয় 1, তবে আমি প্রত্যাশা করি যে যুক্তিসঙ্গত অপ্টিমাইজারটি পূর্ববর্তীটিকে পূর্বের দিকে পরিণত করবে।
ম্যাথিউ এম।

উত্তর:


214

এই কোড লেখক সম্ভবতঃ সমর্থন করতে হতো EBCDIC কিছু পয়েন্ট, যেখানে বর্ণের সাংখ্যিক মান অ সংলগ্ন (ফাঁক মধ্যে বিদ্যমান আছে এ I, Jএবং R, S, আপনি অনুমিত হতে পারে হিসাবে)।

উল্লেখ্য যে, সি এবং সি ++ মান শুধুমাত্র নিশ্চয়তা অক্ষর মূল্য 0থেকে 9অবিকল এই কারণে সংলগ্ন সাংখ্যিক মান আছে, এই পদ্ধতি যাতে তন্ন তন্ন কঠোরভাবে মান-অনুসারী নয়।


64
বাস্তব ডব্লিউটিএফ কেন একটি মন্তব্যে করা মূল লেখক করেনি: // In the EBCDIC coding, the alphabet has gaps between these values. See URL: xxxx for details। তাহলে আপনাকে কখনও প্রশ্ন জিজ্ঞাসা করতে হবে না। কোডটির উত্তর অন্তর্নির্মিত আপনার কাছে রয়েছে।
অ্যাবেলেঙ্কি

66
@ লেবেলঙ্কি যদি কোডটি মূলত এমন একটি সিস্টেমের জন্য ছিল যেখানে সাধারণভাবে ইবিসিডিক ব্যবহৃত হয় তবে এটি সম্ভবত তখন সুস্পষ্ট বলে মনে হয়েছিল এবং তার কোনও মন্তব্যের প্রয়োজন ছিল না, দুর্ভাগ্যক্রমে লিগ্র্যাসি কোডে যে জিনিসগুলি সূক্ষ্ম বলে মনে হয় তা এখন অদ্ভুত বলে মনে হয়।
মান

26
@ লেবেলঙ্কি: আসল ডাব্লুটিএফই কারণ আসল লেখক মানক কার্যকারিতা যেমন ব্যবহার করেন নি return ( isalpha( chValue ) && isupper( chValue ) )...
দেবসোলার

4
@ ড্যামন: এটি ইস্যু নয়। আপনাকে এমন কোনও সিস্টেমে "এলিয়েন" এনকোডিং প্রক্রিয়া করতে হতে পারে যা সেই এনকোডিংটি স্থানীয়ভাবে ব্যবহার করে না। সুতরাং আপনি আপনার স্থানীয় স্থান প্রদত্ত এনকোডিংটিতে সেট করেছেন এবং তারপরে আপনাকে আঙ্গুলগুলি অতিক্রম করতে হবে যে প্রোগ্রামার আসলে উপরের মতো "স্মার্ট" কোডিংয়ের পরিবর্তে মানক ফাংশন ব্যবহার করেছিল, এই ভেবে যে তার প্রোগ্রামটি প্রতিটি এনকোডিংয়ের মুখোমুখি হবে ...
দেবসোলার

6
যদি এটি 1970 এর দশক থেকে EBCDIC সমর্থন করার জন্য লেখা হয়েছিল, তখন কি ইসলফা এবং ইস্পার এমনকি এএনএসআই ছিল নাকি এরপরে সংখ্যাগরিষ্ঠ সংকলক দ্বারা সমর্থিত ছিল?
নিকালহ

54

দেখে মনে হচ্ছে এটি EBCDIC এবং ASCII উভয়ই কভার করার চেষ্টা করে। আপনার বিকল্প পদ্ধতি EBCDIC এর পক্ষে কাজ করে না (এটিতে মিথ্যা ইতিবাচক রয়েছে, তবে কোনও মিথ্যা নেতিবাচক নেই)

সি এবং সি ++ এর জন্য প্রয়োজনীয় যা '0'-'9'সামঞ্জস্যপূর্ণ।

নোট মান গ্রন্থাগার কল না জানতে পারে তারা হওয়া ASCII, EBCDIC বা অন্যান্য সিস্টেমে চালানোর কিনা, তাই তারা আরো পোর্টেবল এবং সম্ভবত আরও দক্ষ নন।


5
std::isupperপ্রকৃতপক্ষে বর্তমানে ইনস্টল করা গ্লোবাল সি লোকেলের অনুসন্ধান করে।
লিঙ্গজি 10

1
হ্যাঁ তুমিই ঠিক. পদ্ধতিটি এনকোডিং উভয় কভার জন্য লেখা হয়। উত্তর করার জন্য ধন্যবাদ!
ভ্লাদিমির চ।

4
@ লিঙ্গসি: সত্য, তবে এর অর্থ এই নয় যে আপনি লোকালটি ASCII থেকে EBCDIC এ স্যুইচ করতে পারবেন। স্থানীয় থেকে নির্বিশেষে 'A'থাকতে 'A'হবে। ASCII থেকে UTF-8, এটি সম্ভব হবে।
ম্যাসাল্টারস

2
@ লিঙ্গসি: std::isupperবর্তমানে ইনস্টল করা গ্লোবাল সি লোকেলগুলি অনুসন্ধান করেছে, হ্যাঁ, তবে সংকলনের পর্ব যা চরিত্রের অক্ষরের ব্যাখ্যা দেয় না।
লাইটনেস রেস

1
@ লিঙ্গসি - কেবল দ্রুত নোট। এটি std::isupperবেশিরভাগ ক্ষেত্রেই সত্যই প্রয়োজন কিনা তা প্রশ্নবিদ্ধ । এটি ব্যবহারকারীর কাছ থেকে ইনপুট দেওয়ার জন্য ব্যবহৃত লোকেলগুলিকে সম্মান করে। ফাইলগুলি বিশ্লেষণ করার সময়, ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার সময় আপনি সাধারণত কিছু অন্যান্য লোকেল আশা করেন। std::isalphaতবুও লিনাক্সে অন্তত এই স্থানীয় সম্পর্কিত কলগুলি খুব ধীর - উদাহরণস্বরূপ ডায়ামিক_কাস্ট দুটি বার কল করে ঠিক একটি অক্ষরের সাথে তুলনা করার আগে যথাযথ লোকাল প্রয়োগকরণ "সন্ধান" করতে।
ইব্রে 5041
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.