>>> সি তে অপারেটর কী?


294

ধাঁধা হিসাবে কোনও সহকর্মীর দেওয়া, আমি বুঝতে পারি না এই সি প্রোগ্রামটি আসলে কীভাবে সংকলন করে এবং চালিত হয়। এই >>>=অপারেটর এবং অদ্ভুত 1P1আক্ষরিক কি? আমি ক্ল্যাং এবং জিসিসিতে পরীক্ষা করেছি। কোনও সতর্কতা নেই এবং আউটপুটটি "???"

#include <stdio.h>

int main()
{
    int a[2]={ 10, 1 };

    while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
        printf("?");

    return 0;
}

36
এর মধ্যে কয়েকটি হ'ল ডিগ্রাফ
janchopanza

12
@ কে, এই ক্ষেত্রে নেই::> =] তারপরে একটি [...] >> = এ [...]
অ্যাড্রিয়ানো রেপিটি

6
@ মার্ক আমি মনে করি না এটি ">>> =" হতে পারে কারণ এটি সংকলন করে না, তবে উপরের কোডটি আসলে সংকলন করে।
কাস্টমাল্যাক

21
এটি 0x.1P1হ'ল হেক্সাডেসিমাল আক্ষরিক যা কোনও এক্সপোনেন্ট সহ। 0x.1সংখ্যা অংশ, বা 1/16 এখানে। 'পি' এর পরে সংখ্যাটি দু'টির শক্তি হ'ল সংখ্যাটি দ্বারা গুণিত হয়। তাই 0x.1p1সত্যিই 1/16 * 2, অথবা 1/8 হয়। এবং আপনার সম্পর্কে হতাশ হয়েছে যদি 0xFULLযে শুধু 0xF, আর ULLএকটি সাফিক্সunsigned long long
jackarms

71
সি বাক্য গঠন - পন্ডিত এবং ট্রিভিয়া প্রেমীদের জন্য অন্তহীন উপাদান, তবে শেষ পর্যন্ত সমস্ত গুরুত্বপূর্ণ নয়।
কেরেরেক এসবি

উত্তর:


468

লাইন:

while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )

ডিগ্রাফগুলি রয়েছে :>এবং <:যা যথাক্রমে অনুবাদ করে ]এবং [তাই এটি এর সমতুল্য:

while( a[ 0xFULL?'\0':-1 ] >>= a[ !!0X.1P1 ] )

আক্ষরিকরূপটি 0xFULLহ'ল 0xF(যা হেক্সের জন্য 15); ULLশুধু নির্দিষ্ট করে এটি একটি এর unsigned long longআক্ষরিক । যাই হোক, একটি বুলিয়ান যেমন সত্য, তাই 0xFULL ? '\0' : -1মূল্যায়ণ করতে '\0', যা একটি হল চরিত্র আক্ষরিক যার সংখ্যাগত মান সহজভাবে হয় 0

এদিকে, 0X.1P1একটি হেক্সাডেসিমাল ভাসমান পয়েন্ট আক্ষরিক 2/16 = 0.125 এর সমান। যাই হোক না কেন, শূন্য নন, এটি বুলিয়ান হিসাবেও সত্য, তাই এটির সাথে দুবার উপেক্ষা করা !!আবার উত্পাদন করে 1। সুতরাং, পুরো জিনিসটি নীচে সরল করে:

while( a[0] >>= a[1] )

অপারেটর >>=একটি যৌগিক কার্যভার যা ডান অপারেন্ড দ্বারা প্রদত্ত বিটের সংখ্যা দ্বারা তার বাম অপারেন্ডকে ডানদিকে বিট-সরিয়ে দেয় এবং ফলাফলটি দেয়। এই ক্ষেত্রে, ডান অপরেন্ডের a[1]সর্বদা মান থাকে 1, সুতরাং এটি এর সমতুল্য:

while( a[0] >>= 1 )

বা, সমতুল্য:

while( a[0] /= 2 )

প্রাথমিক মান a[0]10 হ'ল একবার ডান স্থানান্তরিত হওয়ার পরে, এটি 5 হয়, তারপরে (বৃত্তাকার) 2 হবে, তারপরে 1 এবং শেষ অবধি 0 হবে, যার লুপটি শেষ হয়। সুতরাং, লুপ বডি তিনবার কার্যকর করা হয়।


18
আপনার উপর সম্প্রসারিত দয়া করে P0X.1P1
কে - এসই

77
@Kay: এটা হিসাবে একই eমধ্যে 10e5ছাড়া আপনি ব্যবহার করতে হবে pহেক্সাডেসিমেল লিটারেল কারণ eএকটি হেক্সাডেসিমেল অঙ্ক নয়।
ডায়েটারিচ এপ্প

9
@ কে: হেক্স ফ্লোট লিটারেলগুলি সি 99 এর অংশ, তবে জিসিসি সেগুলি সি ++ কোডেও গ্রহণ করে । ডায়েরিচ যেমন নোট করেছেন, pতেমনই ম্যান্টিসা এবং ঘাতককে পৃথক করে, ঠিক যেমনটি eসাধারণ বৈজ্ঞানিক ভাসমান স্বরলিপি; একটি পার্থক্য হ'ল হেক্স ভাসা দিয়ে, সূচকীয় অংশটির ভিত্তি 10 এর পরিবর্তে 2 হয়, সুতরাং 0x0.1p10x0.1 = 1/16 গুণ 2¹ = 2 এর সমান হয় (কোনও ক্ষেত্রে, এখানে কোনটিই গুরুত্বপূর্ণ নয়; কোনও শূন্য নয়) মান সেখানে সমানভাবে কাজ করবে))
ইলমারি করোনেন

6
@ chux: স্পষ্টতই, এটি কোডটি সি হিসাবে সংকলিত হয়েছে কিনা (বা এটি মূলত ট্যাগ ছিল) সি ++ এর উপর নির্ভর করে। তবে আমি পাঠ্যটি "আক্ষরিক" পরিবর্তে "অক্ষরকে আক্ষরিক" বলার জন্য স্থির করেছিলাম charএবং একটি উইকিপিডিয়া লিঙ্ক যুক্ত করেছি। ধন্যবাদ!
ইলমারি করোনেন

8
চমৎকার হ্রাস।
কোরি

69

এটি ডিগ্রাফগুলির সাথে যুক্ত কিছু অস্পষ্ট কোড যা যথাক্রমে <:এবং :>যা যথাক্রমে [এবং এর জন্য বিকল্প টোকেন ]শর্তসাপেক্ষ অপারেটরের কিছু ব্যবহার রয়েছে । এখানে একটা হয় বিট নাড়াচাড়া অপারেটর , ডান শিফ্ট নিয়োগ >>=

এটি আরও পঠনযোগ্য সংস্করণ:

while( a[ 0xFULL ? '\0' : -1 ] >>= a[ !!0X.1P1 ] )

এবং এর থেকে আরও বেশি পঠনযোগ্য সংস্করণ, এর []মধ্যে প্রকাশিত মূল্যবোধগুলির প্রতিস্থাপনের পরিবর্তে :

while( a[0] >>= a[1] )

প্রতিস্থাপন a[0]এবং a[1]তাদের মানগুলির জন্য লুপটি কী করছে তা নির্ধারণ করা সহজ হওয়া উচিত, সমান:

int i = 10;
while( i >>= 1)

যা প্রতিটি পুনরাবৃত্তিতে সহজভাবে (পূর্ণসংখ্যা) বিভাগ সম্পাদন করে, ক্রম উত্পাদন করে 5, 2, 1


আমি এটিকে চালাইনি - ওপি যেমন পেয়েছিল ????তার চেয়েও কি এটি উত্পাদিত হবে না ???? (হাহ।) Codepad.org/nDkxGUNi করে উত্পাদন ???
usr2564301

7
@ জংওয়ার 10 টি প্রথম পুনরাবৃত্তিতে বিভক্ত হয়ে পড়েছে। সুতরাং লুপ দ্বারা মূল্যায়ন করা মানগুলি 5, 2, 1 এবং 0 হয় So সুতরাং এটি কেবল 3 বার মুদ্রণ করে।
মাইস্টিকএক্সজি

42

বাম থেকে ডান অভিব্যক্তিটি চলুন:

a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]

প্রথম যে বিষয়টি আমি লক্ষ্য করছি তা হ'ল আমরা এর ব্যবহার থেকে টের্নারি অপারেটরটি ব্যবহার করছি ?। সুতরাং subexpression:

0xFULL ? '\0' : -1

বলছে "যদি 0xFULLশূন্য-না হয়, ফিরে আসুন '\0', নাহলে -1স্বাক্ষরযুক্ত স্বাক্ষরিত দীর্ঘ-দীর্ঘ প্রত্যয়0xFULL সহ একটি হেক্সাডেসিমাল আক্ষরিক - এর অর্থ এটি হেক্সাডেসিমাল টাইপের টাইপের That এটি সত্যিকার অর্থে গুরুত্বপূর্ণ নয়, কারণ নিয়মিত পূর্ণসংখ্যার অভ্যন্তরে ফিট হতে পারে।unsigned long long0xF

এছাড়াও, টেরিনারি অপারেটর দ্বিতীয় এবং তৃতীয় পদগুলির প্রকারগুলিকে তাদের সাধারণ ধরণের রূপান্তর করে। '\0'তারপর রূপান্তরিত হয় int, যা ন্যায় 0

মানটি 0xFশূন্যের চেয়ে বড়, তাই এটি পাস হয়। এক্সপ্রেশনটি এখন হয়ে যায়:

a[ 0 :>>>=a<:!!0X.1P1 ]

এর পরে, :>একটি ডিজিট্রাফ । এটি এমন একটি নির্মাণ যা প্রসারিত ]:

a[0 ]>>=a<:!!0X.1P1 ]

>>=স্বাক্ষরিত ডান শিফট অপারেটর, আমরা aএটি স্পষ্ট করে তুলতে যে স্থানটি রাখতে পারি।

তদুপরি, <:একটি ডিজিট্রাফ যা এখানে প্রসারিত [:

a[0] >>= a[!!0X.1P1 ]

0X.1P1এক্সপোনেন্ট সহ একটি হেক্সাডেসিমাল আক্ষরিক। তবে মানটি বিবেচ্য নয়, !!শূন্য নয় এমন যে কোনও কিছুই সত্য। 0X.1P1হয় 0.125যা নন-জিরো, তাই এটি হয়ে:

a[0] >>= a[true]
-> a[0] >>= a[1]

>>=সাইন ইন অধিকার শিফট অপারেটর। এটি অপারেটরের ডানদিকে মানটি দিয়ে তার বিটগুলি সামনে স্থানান্তরিত করে তার বাম অপারেন্ডের মান পরিবর্তন করে। 10বাইনারি হয় 1010। সুতরাং পদক্ষেপ এখানে:

01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000

>>=এটির ক্রিয়াকলাপের ফলাফলটি প্রত্যাবর্তন করে, যতক্ষণ না যতক্ষণ না যতক্ষণ a[0]না প্রতিটি বারের জন্য তার বিটগুলি একসাথে স্থানান্তরিত হয়, ততক্ষণ লুপটি অবিরত থাকবে। চতুর্থ প্রয়াসটি যেখানে a[0]হয় 0তাই লুপটি কখনই প্রবেশ করে না।

ফলস্বরূপ, ?তিনবার মুদ্রিত হয়।


3
:>একটি ডিগ্রাফ , একটি ট্রিগ্রাফ নয়। এটি প্রিপ্রোসেসর দ্বারা পরিচালিত হয় না, এটি কেবল টোকেনের সমতুল্য হিসাবে স্বীকৃত ]
কিথ থমসন

@ কিথ থমসন ধন্যবাদ
0x499602D2

1
টেরিনারি অপারেটর ( ?:) এর মধ্যে একটি টাইপ থাকে যা দ্বিতীয় এবং তৃতীয় পদগুলির সাধারণ ধরণ। প্রথম শব্দটি সর্বদা শর্তসাপেক্ষ এবং একটি ধরণের থাকে bool। যেহেতু দ্বিতীয় এবং তৃতীয় উভয় intপদেই টাইনারারি অপারেশনের ফলাফল হবে টাইপ হয়েছে int, তা নয় unsigned long long
কোরি

2
@ কিথথম্পসন এটি প্রিপ্রোসেসর দ্বারা পরিচালিত হতে পারে। প্রাক প্রসেসর কারণ digraphs সম্পর্কে জানা আছে #এবং ##digraph ফর্ম আছে; প্রারম্ভিক অনুবাদ পর্যায়ক্রমে ডিজিট্রাফগুলি নন-ডিগ্রাফগুলিতে অনুবাদ করা থেকে বাস্তবায়ন বন্ধ করার কিছুই নেই
এমএম

@ ম্যাটম্যাকএনএবিবি আমাকে এটি জানার অনেক দিন হয়ে গেছে, তবে অন্যান্য প্রয়োজনীয়তার ফলস্বরূপ আইআইআরসি, পিপি-টোকেনকে টোকেনে রূপান্তরিত না করা পয়েন্ট অবধি ডিগ্রিফগুলিকে তাদের ডিগ্রাফ আকারে থাকতে হবে (অনুবাদ পর্বের শুরুতে ডানদিকে) 7)।
zwol
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.