কি করে ??! ??! অপারেটর সি তে করেন?


1989

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

!ErrorHasOccured() ??!??! HandleError();

এটি সঠিকভাবে সংকলিত হয়েছে এবং ঠিক আছে বলে মনে হচ্ছে। দেখে মনে হচ্ছে এটির কোনও ত্রুটি ঘটেছে কিনা তা যাচাই করছে এবং যদি এটি থাকে তবে এটি এটি পরিচালনা করে। তবে এটি আসলে কী করছে বা এটি কীভাবে করছে তা আমি নিশ্চিত নই। দেখে মনে হচ্ছে প্রোগ্রামার ত্রুটি সম্পর্কে তাদের অনুভূতি প্রকাশ করার চেষ্টা করছে।

আমি ??!??!কোনও প্রোগ্রামিং ভাষায় এর আগে কখনও দেখিনি এবং এর জন্য কোথাও ডকুমেন্টেশনও খুঁজে পাচ্ছি না। (গুগল অনুসন্ধান শর্তাদি যেমন সাহায্য করে না ??!??!)। এটি কী করে এবং কোড নমুনা কীভাবে কাজ করে?


44
@ পিটারলসন, আপনি কীভাবে !ErrorHasOccurred() ??!???! HandleError();সংকলন আশা করবেন? এটাই ??! ??? !। বিষয়টি প্রমাণ করে?
একটি সিভিএন

31
আমি আপনাকে পরিষ্কার কোড পড়ার পরামর্শ দিচ্ছি। ত্রুটিহাসঅ্যাকচারড () এ ত্রুটিহাসনটকম্পার্ড () এ রিফ্যাক্ট করা উচিত এইভাবে বিস্মৃত চিহ্নটি পরিষ্কার করুন ... এই সমস্ত অপারেটরদের বোঝার সময় কার আছে ??
কাদেকএম

17
আমি বরং ErrorHasOccured() && HandleError()নিজেকে পছন্দ করি। এটি লুয়া এটি করে।
হুগো জিংক

76
@ কাদেকএম, ক্রিয়াকলাপের নামটিতে প্রত্যাখ্যানকে সরানো বিপরীতে পরিষ্কার কোডের জন্য নয়।
মার্সেলম

14
তাদের অনুসন্ধান ইঞ্জিনের সাথে মৃত্যুর লড়াইয়ের পরে এখানে যে কারও জন্য একটি নোট: সিম্বলহাউন্ড প্রতীকী অনুসন্ধানগুলিতে সহায়তা করতে পারে।
জ্যাকব

উত্তর:


1578

??!একটি ট্রাইগ্রাফ যা অনুবাদ করে |। সুতরাং এটি বলে:

!ErrorHasOccured() || HandleError();

সংক্ষিপ্ত সার্কিটের কারণে যা সমান:

if (ErrorHasOccured())
    HandleError();

সপ্তাহের গুরু (সি ++ এর সাথে সম্পর্কিত তবে এখানে প্রাসঙ্গিক), যেখানে আমি এটি তুলেছি।

ট্রিবিফগুলির সম্ভাব্য উত্স বা @ ডাব্লুবি মন্তব্যগুলিতে উল্লেখ করেছে যে এটি ইবিসিডিআইসি (আবার) কঠিন হওয়ার কারণে বেশি সম্ভাবনা রয়েছে। আইবিএম বিকাশকারী বোর্ডে এই আলোচনাটি এই তত্ত্বটিকে সমর্থন করে বলে মনে হচ্ছে।

আইএসও / আইইসি 9899 থেকে: 1999 §5.2.1.1, পাদটীকা 12 (h / t @ র্যান্ডম 832):

ট্রাইগ্রাফ সিকোয়েন্সগুলি অক্ষরগুলির ইনপুটটিকে সক্ষম করে যা আইএসও / আইসিসি 6৪ in-তে বর্ণিত ইনভেরিয়েন্ট কোড সেটে সংজ্ঞায়িত নয় যা সাত-বিট মার্কিন এএসসিআইআই কোড সেটটির একটি উপসেট।


376
আপনার কীবোর্ড যেমন একটি '|' না থাকলে মূলত ট্রিগ্রাফগুলির প্রয়োজন ছিল প্রতীক। এখানে এটি হয় প্রোগ্রামারটি ইচ্ছাকৃতভাবে বিরক্ত করছে বা কিছু উদ্ভট সম্পাদক 'বৈশিষ্ট্য'
মার্টিন বেকেট

35
হ্যাঁ, এটি সমতূল্য এর if (ErrorHasOccured()) HandleError()। ধন্যবাদ আপনি সাধারণত পার্ল কোডে এই প্রতিমাটির মুখোমুখি হন।
ব্যবহারকারী 786653

22
এটি অগত্যা EBCDIC নয় - ট্র্যাকগ্রাফগুলির জন্য প্রয়োজনীয় এমন অক্ষরের সেটটি ISO-646 (যেমন পুরানো 'জাতীয় ascii' স্ট্যান্ডার্ড) এর অদম্য নয় এমন অক্ষরগুলির সংকলনের সাথে প্রায় ঠিক মিলে যায়।
র্যান্ডম 832

52
একটি নিখুঁতভাবে পঠনযোগ্য বিকল্প ErrorHasOccurred() && HandleError();হ'ল এটি যদি আপনি স্ক্রিপ্টিং শেল ব্যবহার করে থাকেন। :)
ইয়াম মার্কোভিচ

18
এটিকে "হয় কোনও ত্রুটিহাস অরচারড নয় বা আপনার অবশ্যই হ্যান্ডেল এরর করতে হবে না" হিসাবে পড়ুন, @ স্পারকি রবিনসন।
ওমর আন্তোলন-কামারেনা

453

ঠিক আছে, কেন এটি সাধারণভাবে বিদ্যমান তা সম্ভবত আপনার উদাহরণে এটির চেয়ে আলাদা।

এটি অর্ধ শতাব্দী আগে কম্পিউটার ইউজার ইন্টারফেস হিসাবে হার্ডকপি যোগাযোগ টার্মিনালগুলি পুনরায় প্রকাশের মাধ্যমে শুরু হয়েছিল। প্রাথমিক ইউনিক্স এবং সি যুগে এটি ছিল ASR-33 টেলি টাইপ।

এই ডিভাইসটি ধীরে ধীরে (10 সিপিএস) এবং কোলাহলপূর্ণ এবং কুরুচিপূর্ণ ছিল এবং এর ASCII চরিত্রের সেটটি 0x5f এ শেষ হয়েছিল, সুতরাং এটিতে (ছবিটি ঘনিষ্ঠভাবে দেখুন) কোনও কী ছিল না:

{ | } ~ 

একটি নির্দিষ্ট সমস্যা সমাধানের জন্য ট্রিগারগুলি সংজ্ঞায়িত করা হয়েছিল। ধারণাটি ছিল যে সি প্রোগ্রামগুলি ASR-33 এবং অন্যান্য পরিবেশে প্রাপ্ত উচ্চ ASCII মানগুলি খুঁজে পাওয়া ASCII উপসেটটি ব্যবহার করতে পারে।

আপনার উদাহরণটি আসলে দুটি ??!অর্থ |, যার অর্থ , ফলস্বরূপ ||

তবে, সংজ্ঞা অনুসারে সি কোড লেখার লোকদের কাছে আধুনিক সরঞ্জাম ছিল, 1 সুতরাং আমার অনুমান: কেউ আপনাকে দেখায় বা মজাদার হন, আপনাকে খুঁজে পাওয়ার জন্য কোডটিতে এক ধরণের ইস্টার ডিম রেখে যায়।

এটি নিশ্চিতভাবেই কাজ করেছে, এটি একটি বুননীয় জনপ্রিয় এসও প্রশ্নে নেতৃত্ব দিয়েছে।

এএসআর -৩৩ টেলি টাইপ

                                            এএসআর -৩৩ টেলি টাইপ


১. এই বিষয়টির জন্য, এএনএসআই কমিটি দ্বারা ট্রিগারগুলি উদ্ভাবন করা হয়েছিল, যা সি দ্বারা চালানো সাফল্যের পরে প্রথম দেখা হয়েছিল , সুতরাং আসল সি কোড বা কোডারগুলির মধ্যে এগুলি ব্যবহার করা হয়নি।


18
এটি কেবলমাত্র কীবোর্ড এবং অক্ষর সেটটিতে অক্ষরগুলি হারিয়ে যাওয়ার ঘটনা নয়। কমোডোর 64৪ সম্ভবত তাদের ত্রিশের দশকের শেষের দিকের বা তার বেশি বয়সের অনেক লোকের সাথে আরও পরিচিত হতে পারে - প্রদর্শিত চরিত্রটি উভয় অভাবযুক্ত ধনুর্বন্ধনী সেট করে (এবং সম্ভবত বার এবং টিল্ডও খুব বেশি) - এই ক্ষেত্রে কারণ "এএসসিআইআই" ASCII ছিল না । ইসিএমএ-6 (প্রায়শই এএসসিআইআই নামে পরিচিত, তবে ইউএস-এএসসিআইআই নয়) 18 টি অঞ্চল-নির্দিষ্ট কোড ছিল তবে আমি জানি না যে সেগুলি কী কোড ছিল। আমি নিশ্চিতভাবে একটি জিনিস বলতে পারি - ব্রিটিশ "এএসসিআইআই" #তে প্রতিস্থাপন করা হয়েছিল £। অন্যান্য অঞ্চলে সম্ভবত "এএসসিআইআই" এর কোনও ধনুর্বন্ধনী ইত্যাদি ছিল না
স্টিভ 314

7
আটারি 8-বিট কম্পিউটারের জন্য সেট করা অনুরূপ ATASCII অক্ষরটিতে {} পাশাপাশি ~ এবং lack এর অভাব ছিল `
dan04

42
দেখুন এই দুই উইকিপিডিয়া নিবন্ধ। আমি এখনও এখনও প্রায় 7-বিট জাতীয় চরসেটগুলির যুগের স্মরণ করার জন্য যথেষ্ট বয়সে রয়েছি (যদিও আমি নিশ্চিত যে তারা এখনও কিছু অন্ধকার অদ্বিতীয় কোণে স্থির রয়েছে), এবং আমি যে বইটি সি থেকে শিখেছি তা সম্পর্কে এই সম্পর্কে সতর্ক করার দরকার পড়েছে ভুল চরসেটে if (x || y) { a[i] = '\0'; }মতো দেখার সম্ভাবনা if (x öö y) ä aÄiÅ = 'Ö0'; å
ইলমারি করোনেন

9
আর একটি আকর্ষণীয় historicalতিহাসিক দ্রষ্টব্য হ'ল ইউনিক্স (যেটি বৃহত প্ল্যাটফর্ম সি রড ইন ছিল) কোনও উচ্চতার প্রথম সিস্টেম হতে পারে (এবং সম্ভবত প্রথম সার্বিক) উচ্চ বর্ণের পরিবর্তে বর্ণানুক্রমিক মানগুলি নিম্নতর ক্ষেত্রে ডিফল্ট করে to যদিও আমি নিজের চোখে অনেক সমসাময়িক সিস্টেম দেখিনি, তবে আমি মনে করি এটি ছিল পরিশীলনের সত্যিকারের লক্ষণ। প্রকৃতপক্ষে একমাত্র শালীন ওএস হওয়ার পরেও ইউনিক্স বিপরীত পরিবর্তে আপনার আপার কেসকে নিম্নে রূপান্তর করেছে। এই ছেলেরা সত্যিই দুর্দান্ত ছিল।
ডিজিটালরোস

16
আমি আপনাকে বলতে চাই মজার গল্প ... আইবিএম আরএস / 6000 ওয়ার্কস্টেশনের এক্সএল ফোর্টরান সংকলকটি এক্সএল সি সংকলক থেকে তৈরি হয়েছিল। প্রথম কয়েকটি প্রকাশে, তারা দুর্ঘটনাক্রমে ত্রিগ্রাফ প্রক্রিয়াকরণে চলে গেছে, সুতরাং কিছু আইনী ফোর্টরান চরিত্রের সিকোয়েন্সগুলি ছিল (আক্ষরিক স্ট্রিংয়ে, আইআইআরসি) যা সি ট্রাইগ্রাফ হিসাবে ভুল ব্যাখ্যা করা হয়েছিল, যার ফলে কিছু আকর্ষণীয় বাগ বাড়ে!
ফিল পেরি

166

এটি সি ট্রিগ্রাফ??!হয় |, তাই ??!??!অপারেটর||


5
ট্রিগ্রাফ এমন সময় থেকে আসে যেখানে কিছু কীবোর্ডের কাছে এখন সমস্ত কীগুলি ছিল না। যখন কোনও পাঠ্য সম্পাদক বিশেষ জিনিসের জন্য বিশেষ অক্ষর সংরক্ষণ করেন তখনও এটি হিল হয়। এটি বেশিরভাগই অতীতের চিত্র এবং কুইজ সক্ষমকারী;)
জোয়েল ফ্যালকু

5
কারণ কিছু কীবোর্ডে সম্ভবত "|" নেই সুতরাং কিছু লোকের কাছে কীবোর্ডটি বারবার শিরোনাম ছাড়া কোনও বিকল্প নেই যতক্ষণ না ট্রাইগ্রাফ ঘটে যা তাদের প্রয়োজনীয় চিহ্নগুলি দেয়।
আউল

এবং তারপরে <iso646.h>শিরোলেখ ফাইল আছে।
ডেভিড আর ট্রাইবল 21

149

ইতিমধ্যেই যেমন বিবৃত ??!??!মূলত দুটি trigraphs ( ??!এবং ??!আবার) একসঙ্গে mushed যে পেতে প্রতিস্থাপিত-অনুবাদ ||, অর্থাত্ লজিক্যাল বা , প্রাক প্রসেসর দ্বারা।

প্রতিটি ট্রিগ্রফ সমন্বিত নিম্নলিখিত টেবিলটি বিকল্প ট্রিগ্রাফ সংমিশ্রণগুলি নিষ্ক্রিয় করতে সহায়তা করবে:

Trigraph   Replaces

??(        [
??)        ]
??<        {
??>        }
??/        \
??'        ^
??=        #
??!        |
??-        ~

উত্স: সি: একটি রেফারেন্স ম্যানুয়াল 5 ম সংস্করণ

সুতরাং এমন একটি ট্রিগার যা দেখে মনে হচ্ছে ??(??)অবশেষে মানচিত্র তৈরি করবে [], ??(??)??(??)প্রতিস্থাপন করবে [][]এবং এরকমভাবে , আপনি ধারণা পাবেন get

যেহেতু প্রিপ্রোসেসিংয়ের সময় ট্রাইগ্রাফগুলি প্রতিস্থাপন করা হয় আপনি cppএকটি নির্বোধ trigr.cপ্রোগ্রামটি ব্যবহার করে নিজেই আউটপুটটি দেখতে পেতে পারেন :

void main(){ const char *s = "??!??!"; } 

এবং এটি দিয়ে প্রক্রিয়াজাতকরণ:

cpp -trigraphs trigr.c 

এর কনসোল আউটপুট পাবেন

void main(){ const char *s = "||"; }

আপনি লক্ষ্য করতে পারেন, বিকল্পটি -trigraphsঅবশ্যই নির্দিষ্ট করতে cppহবে অন্যথায় একটি সতর্কতা জারি করবে; এটি সূচিত করে যে কীভাবে ট্রাইগ্রাফগুলি অতীতের একটি বিষয় এবং তাদের মধ্যে ঝাঁপিয়ে পড়তে পারে এমন মানুষকে বিভ্রান্ত করা ছাড়া আর কোনও আধুনিক মূল্য নেই


ট্রাইগ্রাফ প্রবর্তনের পিছনে যুক্তি হিসাবে , আইএসও / আইইসি 6৪6 এর ইতিহাস বিভাগের দিকে তাকালে এটি আরও ভালভাবে বোঝা যায় :

আইএসও / আইইসি 6৪6 এবং এর পূর্বসূরী এএসসিআইআই (এএনএসআই এক্স 3.4) টেলিযোগাযোগ শিল্পে চরিত্রের এনকোডিংগুলি সম্পর্কে প্রচলিত বিদ্যমান অনুশীলনকে মূলত সমর্থন করে।

যেহেতু এএসসিআইআই ইংরেজি ব্যতীত অন্যান্য ভাষার জন্য প্রয়োজনীয় অনেকগুলি অক্ষর সরবরাহ করে না, তাই বেশ কয়েকটি জাতীয় রূপ তৈরি করা হয়েছিল যা প্রয়োজনীয় বর্ণগুলির সাথে কিছু কম ব্যবহৃত চরিত্রকে প্রতিস্থাপন করে

(জোর আমার)

সুতরাং, সংক্ষেপে, কিছু প্রয়োজনীয় অক্ষর (যাদের জন্য একটি ট্রিিগের উপস্থিত রয়েছে) নির্দিষ্ট জাতীয় রূপগুলিতে প্রতিস্থাপন করা হয়েছিল। এটি অন্যান্য রূপগুলির চারপাশে থাকা অক্ষরগুলি সমন্বিত ট্রাইগ্রাফ ব্যবহার করে বিকল্প প্রতিনিধিত্বের দিকে নিয়ে যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.