আমাদের পোস্টফিক্স ইনক্রিমেন্ট কেন?


55

দাবি অস্বীকার : আমি উপসর্গ এবং পোস্টফিক্স ইনক্রিমেন্টের শব্দার্থক সম্পর্কে ভালভাবে জানি। সুতরাং দয়া করে তারা কীভাবে কাজ করে তা আমাকে ব্যাখ্যা করবেন না।

স্ট্যাক ওভারফ্লোতে প্রশ্নগুলি পড়া, আমি সাহায্য করতে পারছি না তবে লক্ষ্য করুন যে প্রোগ্রামাররা বার বার পোস্টফিক্স ইনক্রিমেন্ট অপারেটর দ্বারা বিভ্রান্ত হয়। এগুলি থেকে নিম্নলিখিত প্রশ্নটি উত্থাপিত হয়: কোনও কোড রয়েছে যেখানে পোস্টফিক্স ইনক্রিমেন্ট কোডের মানের ক্ষেত্রে একটি সত্যিকারের সুবিধা দেয়?

আমাকে একটি উদাহরণ দিয়ে আমার প্রশ্নটি পরিষ্কার করুন। এখানে একটি সুপার-সংশ্লেষ বাস্তবায়ন strcpy:

while (*dst++ = *src++);

তবে এটি আমার বইয়ের সর্বাধিক স্ব-ডকুমেন্টিং কোড নয় (এবং এটি বুদ্ধিমান সংকলকগুলিতে দুটি বিরক্তিকর সতর্কতা উত্পন্ন করে)। তাহলে নিম্নলিখিত বিকল্পের সাথে কী ভুল?

while (*dst = *src)
{
    ++src;
    ++dst;
}

এরপরে আমরা শর্তের মধ্যে বিভ্রান্তিকর দায়িত্ব থেকে মুক্তি পেতে এবং সম্পূর্ণ সতর্কতা-মুক্ত কোড পেতে পারি:

while (*src != '\0')
{
    *dst = *src;
    ++src;
    ++dst;
}
*dst = '\0';

(হ্যাঁ আমি জানি, srcএবং dstএই বিকল্প সমাধানগুলিতে পৃথক পৃথক মান রয়েছে, তবে যেহেতু strcpyলুপের পরে অবিলম্বে ফিরে আসবে, এ ক্ষেত্রে এটি কোনও বিষয় নয়))

দেখে মনে হচ্ছে পোস্টফিক্স ইনক্রিমেন্টের উদ্দেশ্যটি কোডটি যতটা সম্ভব নিখরচায় করা। আমি সহজেই এটি দেখতে আমাদের ব্যর্থ হওয়া উচিত something এটি যদি মূলত পারফরম্যান্স সম্পর্কেই ছিল তবে আজও কি এটি প্রাসঙ্গিক?


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

4
কেন হয় আদৌ?
জেমস ম্যাকনেলিস

31
যদি আমরা প্রোগ্রামারগুলিকে বিভ্রান্ত করার সম্ভাবনাযুক্ত ভাষা থেকে সমস্ত কিছু সরিয়ে ফেলি, তবে আমাদের খুব বেশি বৈশিষ্ট্য থাকবে না। কিছু আপনার পক্ষে কার্যকর নয়, বা কেবল খুব কমই কার্যকর, এর অর্থ এই নয় যে এটি ছিন্ন করা উচিত। এটি যদি আর প্রাসঙ্গিক না হয় তবে এটি ব্যবহার করবেন না; শেষ।
কোডি গ্রে

4
হ্যাঁ তবে তারপরে আপনি কখনই করতে পারবেন নাint c = 0; c++;
বিফ ম্যাগগ্রিফ

4
@ কোডি: কারণ কিছু জিনিস দুটি বিভ্রান্তিকর এবং দরকারী। তিনি পোস্ট-ইনক্রিমেন্টে নিজেই বিভ্রান্ত নন, তিনি এর দরকারীতা সম্পর্কে বিভ্রান্ত । আমাদের কাছে অকেজো, বিভ্রান্তিকর বা না থাকা জিনিসগুলি থাকা উচিত নয়।
GManNickG

উত্তর:


23

যদিও এতে একবারে কিছু কার্য সম্পাদন হয়েছে তবে আমি মনে করি আসল কারণটি আপনার অভিপ্রায়টি পরিষ্কারভাবে প্রকাশ করা। আসল প্রশ্নটি হ'ল কিছু while (*d++=*s++);স্পষ্টভাবে অভিপ্রায় প্রকাশ করে কিনা । আইএমও, এটি করে এবং আপনি যে বিকল্পগুলি কম স্বচ্ছতার প্রস্তাব দিয়েছিলেন তা খুঁজে পেয়েছি - তবে এটি (সহজেই) কয়েক দশক অতিবাহিত করার ফলস্বরূপ হতে পারে যে কীভাবে জিনিসগুলি সম্পন্ন হয়। কে অ্যান্ডআর থেকে সি শিখেছে (কারণ তখন সি-তে অন্য কোনও বই ছিল না) সম্ভবত এটিও খুব সাহায্য করে।

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

অবশ্যই ওভারবোর্ডে যাওয়া সম্ভব, তবে আমার মনে হয় না এটি। বিশেষত, আমি মনে করি যে কোডের একক লাইনটি বোঝা অত্যন্ত কঠিন বা সময় সাপেক্ষ হয়ে ওঠে - বিশেষত, যখন কোডের কম লাইন বোঝা আরও লাইন বোঝার চেয়ে বেশি প্রচেষ্টা গ্রহণ করে। এটি লিস্প এবং এপিএল-এ ঘন ঘন, তবে মনে হয় না (কমপক্ষে আমার কাছে) এখানে ঘটনা ঘটবে।

আমি সংকলক সতর্কতা সম্পর্কে কম উদ্বিগ্ন - এটি আমার অভিজ্ঞতা যে অনেক সংকলক মোটামুটি নিয়মিতভাবে সম্পূর্ণ হাস্যকর সতর্কতা নির্গত করে। যদিও আমি অবশ্যই মনে করি লোকেরা তাদের কোডটি বুঝতে হবে (এবং এটির দ্বারা প্রদত্ত যে কোনও সতর্কতা), কিছু সংকলকটিতে একটি সতর্কতা ট্রিগার করতে যে শালীন কোডটি ঘটে তা অগত্যা ভুল নয়। স্বীকার করা যায়, নতুনরা সর্বদা জানে না তারা কী নিরাপদে উপেক্ষা করতে পারে, তবে আমরা চিরকালের জন্য থাকি না, এবং আমরা যেমন হয় তেমন কোড করার দরকার নেই।


12
আমাদের মধ্যে কারও কাছে পড়ার জন্য সংক্ষিপ্ত সংস্করণটি আরও সহজ out :-)

1
আপনি যদি আপনার কয়েকটি সংকলক সতর্কবার্তা পছন্দ করেন না (এবং আমি ছাড়া আরও কিছু করতে পেরেছি - গুরুত্ব সহকারে, আমি টাইপ করতে চেয়েছিলামif(x = y) , আমি শপথ করছি!) আপনার সংকলকের সতর্কতা বিকল্পগুলি সমন্বয় করা উচিত যাতে আপনি দুর্ঘটনাক্রমে এটিকে মিস না করেন আপনার পছন্দ মত সতর্কতা ।

4
@Brooks মূসা: আমি একটি আছি অনেক কম যে সম্পর্কে enthused। সংকলকের ত্রুটিগুলি তৈরি করতে আমি আমার কোডকে দূষিত করতে পছন্দ করি না।
জেরি কফিন

1
@ জেরি, @ ক্রিস: এই টীকাটি সেই মামলার উদ্দেশ্যে করা হয়েছে যেখানে আপনি মনে করেন যে সতর্কতাটি সাধারণত একটি ভাল জিনিস, তবে আপনি কোনও নির্দিষ্ট লাইনে এটি অস্বাভাবিক কিছু করার জন্য প্রয়োগ করতে চান না। যদি আপনি কখনই সতর্কতাটি না চান এবং এটিকে একটি অভাব হিসাবে বিবেচনা করেন তবে ব্যবহার করুন -Wno-X, তবে আপনি যদি কেবলমাত্র এটির জন্য একটি ব্যতিক্রম করতে চান এবং সতর্কতাটি অন্য কোথাও প্রয়োগ করতে চান তবে ক্রিসের মতো আরকেন হুপ-জাম্পিং ব্যবহার করার চেয়ে এটি আরও বেশি বোধগম্য to ।

1
@ ব্রুকস: দ্বিগুণ বন্ধনী এবং (void)xঅব্যবহৃত সতর্কতা নিঃশব্দ করা অন্যথায় দরকারী সতর্কতাগুলিকে নিঃশব্দ করার জন্য যথেষ্ট পরিচিত। টীকাটি দেখতে কিছুটা ভালো লাগে pragmas, পোর্টেবল ভাল নয়: /
ম্যাথিউ এম।

32

এটি, ভুল ছিল, একটি হার্ডওয়্যার জিনিস


আকর্ষণীয় যে আপনি লক্ষ্য করবেন। পোস্টফিক্স ইনক্রিমেন্ট সম্ভবত বেশ কয়েকটি পুরোপুরি ভাল কারণে রয়েছে, তবে সি এর অনেকগুলি জিনিসের মতোই এর জনপ্রিয়তাটি ভাষাটির উত্সের সন্ধান করতে পারে।

যদিও সি বিভিন্ন ধরণের প্রাথমিক ও আন্ডার পাওয়ার্ড মেশিনে বিকশিত হয়েছিল, সি এবং ইউনিক্স প্রথমবারের মতো পিডিপি -11 এর মেমরি-পরিচালিত মডেলগুলির সাথে আপেক্ষিক বড়-সময়টিকে আঘাত করেছিল। এই তাদের দিনে অপেক্ষাকৃত গুরুত্বপূর্ণ কম্পিউটার ছিল এবং ইউনিক্স ছিল দ্বারা পর্যন্ত ভাল - ব্যাখ্যা মূলকভাবে ভাল - অন্য 7 নোংরা অপারেটিং -11 জন্য উপলব্ধ সিস্টেম থাকে।

এবং, এটি ঘটে, পিডিপি -11 এ,

*--p

এবং

*p++

... অ্যাড্রেসিং মোড হিসাবে হার্ডওয়্যারে প্রয়োগ করা হয়েছিল । (এছাড়াও *p, তবে অন্য কোনও সংমিশ্রণ নেই)) সেই প্রাথমিক মেশিনগুলিতে 0.001 গিগাহার্জ- এরও কম , একটি লুপে দুটি বা দুটি নির্দেশিকা সঞ্চয় করা প্রায় ওয়েট-এ-সেকেন্ড বা ওয়েট-এ-মিনিট বা বাইরে চলে যেতে হবে লঞ্চ পার্থক্য। এটি স্পষ্টতই পোষ্টক্রেনমেন্টের সাথে স্পষ্টভাবে কথা বলতে পারে না, তবে পয়েন্টার পোস্টকন্ট্রেন্টের একটি লুপটি তত্ক্ষণিকভাবে সূচকের চেয়ে অনেক ভাল হতে পারে।

ফলস্বরূপ, ডিজাইনের ধরণগুলি কারণ সি আইডিয়ামগুলি যা সি মানসিক ম্যাক্রোতে পরিণত হয়েছিল।

এটি ঠিক ঠিক পরে ভেরিয়েবলগুলি ঘোষণার মতো {... C89 যেহেতু বর্তমান ছিল এটির প্রয়োজন ছিল না, তবে এটি এখন কোড প্যাটার্ন।

আপডেট: স্পষ্টতই, মূল কারণটি *p++ভাষায় কারণ এটি প্রায়শই যা করতে চায় ঠিক তা হয়। কোড প্যাটার্নটির জনপ্রিয়তা জনপ্রিয় হার্ডওয়্যার দ্বারা আরও শক্তিশালী হয়েছিল যা পিডিপি -11 এর আগমনের আগে সামান্য ডিজাইন করা একটি ভাষার ইতিমধ্যে বিদ্যমান প্যাটার্নটির সাথে মেলে।

আজকাল আপনি কোন প্যাটার্নটি ব্যবহার করেন, বা আপনি যদি ইনডেক্সিং ব্যবহার করেন তবে কোনও পার্থক্য নেই এবং আমরা সাধারণত যেভাবেই উচ্চতর স্তরে প্রোগ্রাম করি তবে এটি অবশ্যই ০.০০১ গিগাহার্টজ মেশিনে অনেক বেশি গুরুত্বপূর্ণ ছিল এবং আপনাকে বোঝাতে চেয়েছিল *--xবা অন্য কিছু ব্যবহার করতে চাইছে *x++পিডিপি -11 "পেয়েছে না" এবং আপনার কাছে লোকেরা আসতে পারে এবং বলেছিল "আপনি কি জানেন ..." :-) :-)


25
উইকিপিডিয়া বলছে: "এ (মিথ্যা) লোক শ্রুতি যে পিডিপি -11 এর নির্দেশ সেট স্থাপত্য সি প্রোগ্রামিং ভাষার কথ্য ব্যবহার প্রভাবিত পিডিপি -11 এর বৃদ্ধি এবং হ্রাস অ্যাড্রেসিং মোড মিলা। −−iএবং i++সি তাহলে নির্মান iএবং jউভয়ই নিবন্ধভঙ্গি ভেরিয়েবল ছিল, একটি অভিব্যক্তি যেমন *(−−i) = *(j++)একটি একক মেশিনের নির্দেশে সংকলিত হতে পারে [[...] ডেনিস রিচি অবিস্মরণীয়ভাবে এই
লোককথার সাথে

3
হু (ফ্রেডওভারফ্লো এর মন্তব্যে প্রদত্ত লিঙ্কটি থেকে): "লোকেরা প্রায়শই অনুমান করে যে তারা ডিসি পিডিপি -11 দ্বারা প্রদত্ত অটো-ইনক্রিমেন্ট এবং অটো-হ্রাস ঠিকানা মোডগুলি ব্যবহার করার জন্য তৈরি করা হয়েছিল যার উপর সি এবং ইউনিক্স প্রথম জনপ্রিয় হয়েছিল। এটি historতিহাসিকভাবে অসম্ভব, যেহেতু বি বিকাশকালে কোনও PDP-11 ছিল না। PDP-7 তে কয়েকটি 'অটো-ইনক্রিমেন্ট' মেমরি কোষ ছিল, সেই সম্পত্তি সহ যা তাদের মাধ্যমে একটি অপ্রত্যক্ষ মেমরি রেফারেন্স কোষকে বাড়িয়ে দেয় This সম্ভবত এই বৈশিষ্ট্যটি থম্পসনকে এই ধরনের অপারেটরদের পরামর্শ দিয়েছিলেন; এগুলি উভয়কে উপসর্গ এবং পোস্টফিক্স তৈরির সাধারণীকরণই তাঁর নিজস্ব ছিল। "

3
ডিএমআর কেবল বলেছিল যে পিডিপি -11 সি-তে যুক্ত হওয়ার কারণ ছিল না আমি তাও বলেছিলাম। আমি যা বলেছিলাম তা হ'ল এটি পিডিপি -11 এ সুবিধার্থে ব্যবহৃত হয়েছিল এবং সঠিক কারণেই এটি একটি জনপ্রিয় নকশার প্যাটার্নে পরিণত হয়েছিল। উইকিপিডিয়া contradicts তাহলে যে তারপর তারা কেবল ভুল, কিন্তু আমি এটা যে ভাবে পড়া না। এটি ডাব্লু পৃষ্ঠায় খারাপভাবে বর্ণিত।
ডিজিটালরোস

3
@FredOverflow। আমি মনে করি আপনি "লোককথার" কাহিনীটি ঠিক তা ভুল বুঝেছেন। পৌরাণিক কাহিনীটি হ'ল সি এই 11 টি অপ্সকে কাজে লাগানোর জন্য ডিজাইন করা হয়েছিল, এটি নয় যে তাদের উপস্থিতি নেই এবং কোড প্যাটার্নটি জনপ্রিয় হয়ে উঠেনি কারণ সকলেই জানেন তারা 11 টি ভালভাবে ম্যাপ করেছেন। যদি এটি পরিষ্কার হয় না: পিডিপি -11 সত্যিকার অর্থে অ্যাড্রেসিং মোড হিসাবে প্রায় প্রতিটি নির্দেশের জন্য হার্ডওয়্যারে এই দুটি পদ্ধতি বাস্তবায়িত করে এবং এটিই ছিল প্রথম গুরুত্বপূর্ণ মেশিন সি চালানো।
ডিজিটালরোস

2
"এটি অবশ্যই এই 0.001GHz মেশিনে অনেক বেশি গুরুত্বপূর্ণ ছিল"। ওম, আমি এটি বলার জন্য ঘৃণা করি কারণ এটি আমার তারিখের, তবে আমার সিপিইউগুলির জন্য নির্দেশাবলী এবং তারা কতগুলি চক্র নিয়েছিল তার আকার অনুসন্ধান করার জন্য আমার কাছে মটোরোলা এবং ইন্টেল ম্যানুয়াল ছিল। প্রিন্ট স্পুলারের সাথে আরও একটি বৈশিষ্ট্য যুক্ত করতে সক্ষম হওয়া এবং কয়েকটি চক্র সঞ্চয় করার অর্থ সর্বাধিকতম কোডগুলি সন্ধান করা মানে সিরিয়াল বন্দরটি নতুন উদ্ভাবিত এমআইডিআইয়ের মতো কিছু প্রোটোকল রাখতে পারে। সি নিট-পিকিংয়ের কিছুটা উপশম করেছে, বিশেষত সংকলকগুলির উন্নতি করার পরেও কোডটি লেখার সর্বাধিক দক্ষ উপায় কোনটি ছিল তা জানা গুরুত্বপূর্ণ ছিল।
টিন ম্যান

14

প্রিফিক্স এবং পোস্টফিক্স --এবং ++অপারেটরগুলি কে থমসন বি ভাষায় (সি এর পূর্বসূর) পরিচয় করিয়েছিলেন - এবং না, পিডিপি -11 দ্বারা এগুলি অনুপ্রাণিত হয়নি, যা সে সময় ছিল না।

ডেনিস রিচি দ্বারা "সি ভাষার ভাষার বিকাশ" থেকে উদ্ধৃত :

থম্পসন ++এবং আবিষ্কার আবিষ্কার করে আরও একধাপ এগিয়ে গেলেন--অপারেটর, যা বৃদ্ধি বা হ্রাস; তাদের উপসর্গ বা পোস্টফিক্স অবস্থানটি নির্ধারণ করে যে পরিবর্তনটি অপারেন্ডের মান উল্লেখ করার আগে বা পরে ঘটে কিনা। এগুলি বি এর প্রথম দিকের সংস্করণগুলিতে ছিল না, তবে পথে উপস্থিত হয়েছিল। লোকেরা প্রায়শই অনুমান করে যে তারা ডিসি পিডিপি -11 দ্বারা সরবরাহিত অটো-ইনক্রিমেন্ট এবং অটো-হ্রাস ঠিকানা মোডগুলি ব্যবহার করার জন্য তৈরি করা হয়েছিল যার উপর সি এবং ইউনিক্স প্রথম জনপ্রিয় হয়েছিল। এটি historতিহাসিকভাবে অসম্ভব, যেহেতু বি বিকাশকালে কোনও পিডিপি -11 ছিল না। PDP-7 তে কয়েকটি 'অটো-ইনক্রিমেন্ট' মেমরি কোষ ছিল, সেই সম্পত্তি সহ যা তাদের মাধ্যমে একটি অপ্রত্যক্ষ মেমরি রেফারেন্সটি সেলকে বাড়িয়ে তোলে। এই বৈশিষ্ট্যটি সম্ভবত থম্পসনকে এই ধরনের অপারেটরদের পরামর্শ দেয়; এগুলি উভয়কে উপসর্গ এবং পোস্টফিক্স তৈরির সাধারণীকরণ ছিল তার নিজস্ব। প্রকৃতপক্ষে,++xচেয়ে ছোট ছিল x=x+1


8
না, আমি কেন টম্পসনের সাথে সম্পর্কিত নই।
কিথ থম্পসন

এই খুব আকর্ষণীয় রেফারেন্স জন্য ধন্যবাদ! এটি মূল কেএন্ডআর থেকে আমার উক্তিটিকে নিশ্চিত করে যা কোনও প্রযুক্তিগত অপ্টিমাইজেশনের চেয়ে কমপ্যাক্টনেসের লক্ষ্য প্রস্তাব করেছিল। তবে আমি জানতাম না যে এই অপারেটরগুলি ইতিমধ্যে বি তে বিদ্যমান ছিল
ক্রিস্টোফ

@ বেনপেন যতদূর আমি জানি যে কোনও আলাদা এসই সাইটে নকল রয়েছে যদি প্রশ্নগুলি বন্ধ করার কোনও নীতি নেই , যতক্ষণ না উভয় প্রশ্নই তাদের নিজ নিজ সাইটে ফিট করে।
সাধারণ

আকর্ষণীয় ... প্রোগ্রামারটি অবশ্যই কোনও প্রশ্নের কাছাকাছি নয়।
বেনপেন

@ বেনপেন: স্ট্যাক ওভারফ্লো প্রশ্নটির স্বীকৃত উত্তর ইতিমধ্যে আমার একই উত্সটি উদ্ধৃত করেছে (যদিও এটি যথেষ্ট পরিমাণে নয়)।
কিথ থম্পসন

6

পোস্ট-সেন্ট্রিমেন্ট অপারেটরটির উপস্থিতির সুস্পষ্ট কারণটি হ'ল যাতে আপনাকে একা (++x,x-1)বা (x+=1,x-1)সমস্ত জায়গার মতো মত প্রকাশ করতে হয় না বা সহজেই বোঝার মতো পার্শ্ব প্রতিক্রিয়াগুলি দিয়ে একাধিক বিবৃতিতে অপ্রয়োজনীয়ভাবে পৃথক তুচ্ছ বিবৃতি দেয়। এখানে কিছু উদাহরন:

while (*s) x+=*s++-'0';

if (x) *s++='.';

যখনই ফরোয়ার্ড দিকের স্ট্রিং পড়া বা লেখার জন্য, পোস্টক্রেন্টমেন্ট, এবং প্রাক-ক্রিমেন্ট না হয় প্রায় সবসময়ই প্রাকৃতিক ক্রিয়াকলাপ। আমি প্রাক-প্রাক-ব্যবহারের জন্য রিয়েল-ওয়ার্ল্ড ব্যবহারগুলির প্রায় কখনও মুখোমুখি হইনি, এবং পূর্বনির্ধারণের জন্য আমি খুঁজে পেয়েছি এমন একমাত্র প্রধান ব্যবহার সংখ্যাগুলিকে স্ট্রিংয়ে রূপান্তরিত করে (কারণ মানব লেখার সিস্টেমগুলি সংখ্যাগুলি পিছনে লিখে দেয়)।

সম্পাদনা: আসলে এটি এতটা কুৎসিত হবে না; আপনি পরিবর্তে (++x,x-1)অবশ্যই ব্যবহার করতে পারেন ++x-1বা (x+=1)-1। তবুও x++বেশি পঠনযোগ্য।


আপনি দুটি অনুক্রমের পয়েন্টের মধ্যে একটি ভেরিয়েবলটি সংশোধন করছেন এবং পড়ছেন তাই আপনাকে এই অভিব্যক্তিগুলি সম্পর্কে সতর্কতা অবলম্বন করতে হবে। সেই ক্রমগুলি যে ক্রমে মূল্যায়ন করা হয় তা গ্যারান্টিযুক্ত নয়।

@ স্নোমান: কোনটি? আমি আমার উত্তরে এরকম কোনও সমস্যা দেখছি না।
আর ..

আপনার মতো কিছু থাকলে (++x,x-1)(ফাংশন কল, সম্ভবত?)

@ সোনমান: এটি কোনও ফাংশন কল নয়। এটি সি কমা অপারেটর, যা একটি সিকোয়েন্স পয়েন্ট, অগ্রাধিকার নিয়ন্ত্রণের জন্য প্রথম বন্ধনীযুক্ত। ফলাফল x++বেশিরভাগ ক্ষেত্রে একই হয় (এক ব্যতিক্রম: xস্বাক্ষরযুক্ত স্বাক্ষরযুক্ত টাইপ যার চেয়ে কম র‌্যাঙ্ক থাকে intএবং এর প্রাথমিক মান xহল এই ধরণের সর্বোচ্চ মান)।
আর ..

আহ, কচি কমা অপারেটর ... যখন কমা কমা নয়। কমা অপারেটরের প্রথম বন্ধনী এবং বিরলতা আমাকে ফেলে দিয়েছে। কিছু মনে করো না!

4

পিডিপি -11 নির্দেশিকাতে পোস্ট-ইনক্রিমেন্ট এবং প্রাক-হ্রাস ক্রিয়াকলাপ সরবরাহ করেছে। এখন এই নির্দেশ ছিল না। এগুলি ছিল নির্দেশিকা পরিবর্তনকারী যা আপনাকে উল্লেখ করার অনুমতি দেয় যে আপনি কোনও রেজিস্টারের মূল্যবৃদ্ধির আগে বা হ্রাসের পরে তার মূল্য চান।

এখানে যন্ত্রের ভাষায় একটি শব্দ-অনুলিপি পদক্ষেপ রয়েছে:

movw (r1)++,(r2)++

যা কোনও শব্দকে একটি লোকেশন থেকে অন্য জায়গায় নিয়ে গিয়েছিল, রেজিস্ট্রারদের নির্দেশ করে এবং রেজিস্টারগুলি আবার এটি করতে প্রস্তুত।

সিটি যেমন পিডিপি -11-তে নির্মিত হয়েছিল, প্রচুর দরকারী ধারণাগুলি তাদের সিতে প্রবেশের উপায় খুঁজে পেয়েছিল সি এর জন্য এসেম্ব্লার ভাষার জন্য একটি কার্যকর প্রতিস্থাপন বলে মনে করা হয়েছিল। প্রতি-বর্ধিতকরণ এবং উত্তর-হ্রাস সাম্প্রতির জন্য যুক্ত করা হয়েছিল।


এটি উজ্জ্বল সংশোধনকারী ... এটি আমাকে পিডিপি -11 অ্যাসেম্বলি শিখতে চায়। বিটিডাব্লু, আপনার কি "প্রতিসাম্যের জন্য" রেফারেন্স রয়েছে? এটি বোধগম্য হয়, তবে এটি ইতিহাস, কখনও কখনও বোঝার মূল বিষয় ছিল না। উচ্চহাস্য
BenPen

2
অ্যাড্রেসিং মোড হিসাবেও পরিচিত । পিডিপি -11 পোস্ট-ইনক্রিমেন্ট এবং প্রাক-হ্রাস সরবরাহ করেছে যা স্ট্যাক ক্রিয়াকলাপের জন্য সুন্দরভাবে একত্রে জুড়েছিল।
এরিক tদ 21

1
PDP-8 একটি পোস্ট-ইনক্রিমেন্ট মেমরি ইন্ডায়ারেশন সরবরাহ করেছে, তবে কোনও পূর্ব-হ্রাস প্রক্রিয়াকরণ নয়। চৌম্বকীয় কোর মেমরির সাহায্যে, একটি মেমরি শব্দের পাঠ এটি মুছে ফেলে (!), তাই প্রসেসরটি কেবল পঠিত শব্দটি পুনরুদ্ধার করতে একটি লিখন-ব্যাক ফাংশন ব্যবহার করে। ফিরে লেখার আগে ইনক্রিমেন্ট প্রয়োগ করা স্বাভাবিকভাবেই শুরু হয়েছিল এবং আরও কার্যকর ব্লক পদক্ষেপ নেওয়া সম্ভব হয়েছিল।
এরিক tদ

3
দুঃখিত, PDP-11 এই অপারেটরদের অনুপ্রেরণা জোগায় নি। কেন থম্পসন আবিষ্কার করেছিলেন তখনও এটি বিদ্যমান ছিল না। আমার উত্তর দেখুন ।
কিথ থম্পসন

3

আমি সন্দেহ করি যে এটি কখনও সত্যই প্রয়োজন ছিল। যতদূর আমি জানি, এটি লুপে প্রাক-বর্ধিত ব্যবহারের চেয়ে বেশিরভাগ প্ল্যাটফর্মগুলিতে আরও কিছু কমপ্যাক্টের মধ্যে সংকলন করে না। এটি তৈরি করা ঠিক সময়ে, কোডের স্পষ্টতা কোডের স্পষ্টতার চেয়ে গুরুত্বপূর্ণ ছিল।

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

এটি & এবং | এর মতো সাজানো অপারেটর == এর চেয়ে কম প্রাধান্য পেয়েছে

এটি সেরা উদ্দেশ্যগুলি (&& এবং || এর একটি সংক্ষিপ্ত সার্কিট সংস্করণ) দিয়ে ডিজাইন করা হয়েছিল, তবে এখন এটি প্রতিদিন প্রোগ্রামারগুলিকে বিভ্রান্ত করে এবং সম্ভবত এটি কখনও পরিবর্তন হয় না।

যাইহোক, এটি কেবলমাত্র একটি উত্তর যা আমি মনে করি আপনার প্রশ্নের কোনও ভাল উত্তর নেই, তবে আমি সম্ভবত আমার চেয়ে আরও গুরু গুরু দ্বারা ভুল প্রমাণিত হব।

--EDIT--

আমার মনে রাখা উচিত যে আমি উভয়ই অবিশ্বাস্যরূপে দরকারী বলে মনে করি, আমি কেবল এটিই ইঙ্গিত করছি যে এটি পছন্দ করে বা না নেয় তা পরিবর্তিত হবে না।


এটি এমনকি দূরবর্তী সত্য নয়। কোনও ক্ষেত্রে স্পষ্টতার চেয়ে "কোডের ক্ষুদ্রতা" বেশি গুরুত্বপূর্ণ ছিল না।
কোডি গ্রে

ঠিক আছে, আমি যুক্তি দেব যে এটি ফোকাস পয়েন্ট অনেক বেশি ছিল। আপনি যদিও একেবারেই ঠিক বলেছেন, বেশিরভাগ মানুষের কাছে অবশ্যই কোডের স্পষ্টতার চেয়ে বেশি গুরুত্বপূর্ণ ছিল না ।

6
ওয়েল, "সংশ্লেষ" এর সংজ্ঞাটি হ'ল স্বাচ্ছন্দ্যে মার্জিত: পালিশ করা "বা" কয়েকটি শব্দ ব্যবহার করে: অতিমাত্রায় বিহীন "উভয়ই কোড লেখার সময় সাধারণত ভাল জিনিস। "টর্স" এর অর্থ "অস্পষ্ট, পড়া কঠিন এবং অবিচ্ছিন্ন" নয় যা অনেকে মনে করেন।
জেমস ম্যাকনেলিস

@ জেমস: আপনি সঠিক হিসাবে, আমি মনে করি বেশিরভাগ লোকেরা প্রোগ্রামিং প্রসঙ্গে এটি ব্যবহার করার সময় "সংশ্লেষ" এর দ্বিতীয় সংজ্ঞা বোঝায়: "কয়েকটি শব্দ ব্যবহার করে; অতিমাত্রায় আচ্ছন্ন নয়"। এই সংজ্ঞা অনুসারে, পরিস্থিতিগুলি অনুধাবন করা সহজ যে কোনও নির্দিষ্ট কোডের ব্রেভিটি এবং এক্সপ্রেসিভনেসের মধ্যে বাণিজ্য রয়েছে। স্পষ্টতই কোড লেখার সময় সঠিক জিনিসটি কথা বলার সময় একই জিনিস: জিনিসগুলি যতটা প্রয়োজন তত সংক্ষিপ্ত করুন, তবে সংক্ষিপ্ত নয়। অভিব্যক্তির উপর তীব্রতা মূল্যবান অবলম্বন-বর্ণন কোডের দিকে নিয়ে যেতে পারে, তবে এটি অবশ্যই হওয়া উচিত নয়।
কোডি গ্রে

1
40 বছর রিওয়াইন্ড করুন এবং কল্পনা করুন যে আপনাকে সেই ড্রামটিতে আপনার প্রোগ্রামটি ফিট করতে হবে যা কেবলমাত্র 1000 টি অক্ষর ধারণ করবে, বা একটি সংকলক লিখতে কেবল 4 হাজার বাইট র্যাম দিয়ে কাজ করতে পারে। এমন সময় ছিল যেখানে স্বচ্ছতা বনাম স্বচ্ছতা এমনকি কোনও সমস্যা ছিল না। আপনাকে ছড়িয়ে যেতে হবে, এই গ্রহে এমন কোনও কম্পিউটার উপস্থিত ছিল না যা আপনার অ-সংশ্লেষ প্রোগ্রামটি সংরক্ষণ, পরিচালনা বা সংকলন করতে পারে।
নং

3

পয়েন্টারগুলির সাথে ডিল করার সময় আমি পোস্টফিক্স অ্যাপারেটরটি পছন্দ করি (যদিও আমি সেগুলি ডিফার করছি না) because

p++

সমপরিমাণের চেয়ে "পরের স্পটে যান" হিসাবে স্বাভাবিকভাবে পড়েন

p += 1

যা অবশ্যই প্রাথমিকভাবে প্রথমবারের মতো এটি কোনও পয়েন্টারের সাথে ব্যবহার করতে দেখে বিভ্রান্ত করতে হবে যেখানে মাপের (* পি)! = 1

আপনি কি নিশ্চিত যে আপনি বিভ্রান্তির সমস্যাটি সঠিকভাবে বলছেন? যে জিনিসটি প্রাথমিকভাবে এই বিষয়টি বিভ্রান্ত করে তা নয় যে পোস্টফিক্স ++ অপারেটরের অবজ্ঞান * অপারেটরের চেয়ে বেশি অগ্রাধিকার রয়েছে যাতে

*p++

পার্স হিসাবে

*(p++)

এবং না

(*p)++

কেউ কেউ আশা করতে পারে?

(আপনি কি মনে করেন যে এটি খারাপ? সি ঘোষণা পড়তে দেখুন ))


2

ভাল প্রোগ্রামিংয়ের সূক্ষ্ম উপাদানগুলির মধ্যে রয়েছে স্থানীয়করণ এবং ন্যূনতমতা :

  • ব্যবহারের ন্যূনতম স্কোপে ভেরিয়েবল স্থাপন করা
  • লেখার অ্যাক্সেস প্রয়োজন হয় না যখন কনট ব্যবহার
  • প্রভৃতি

একই আত্মা, x++বর্তমান মূল্য একটি রেফারেন্স localising একটি উপায় হিসেবে দেখা যেতে পারে xযখন অবিলম্বে নির্দেশ করে আপনি কি করেছেন - অন্তত এখন জন্য - যে মান সমাপ্ত এবং (পরবর্তী স্থানান্তর করতে চান বৈধ কিনা xএকজন intবা একটি পয়েন্টার বা পুনরুক্তি)। কিছুটা কল্পনা করে আপনি এটি তুলনা করতে পারেন পুরানো মান / অবস্থানের x"সুযোগ থেকে দূরে" যাওয়ার দরকার নেই এর পরে এটির আর প্রয়োজন নেই, এবং নতুন মানটিতে চলে যেতে। যে রূপান্তরটি সম্ভব সেখানে সুনির্দিষ্ট পয়েন্টটি পোস্টফিক্সের মাধ্যমে হাইলাইট করা হয়েছে++ । এই বোঝাতে যে সম্ভবত এটি "পুরানো" এর চূড়ান্ত ব্যবহারটি xঅ্যালগরিদমের মূল্যবান অন্তর্দৃষ্টি হতে পারে, পার্শ্ববর্তী কোডটি স্ক্যান করার সাথে সাথে প্রোগ্রামারকে সহায়তা করে। অবশ্যই, পোস্টফিক্স++ প্রোগ্রামারটিকে নতুন মানটির ব্যবহারের সন্ধান করতে পারে, যা নতুন মূল্যটি কখন প্রয়োজন হয় তার উপর নির্ভর করে ভাল নাও হতে পারে, তাই আরও কী কী তা নির্ধারণ করার জন্য এটি প্রোগ্রামিংয়ের "আর্ট" বা "ক্র্যাফট" এর একটি দিক পরিস্থিতিতে সহায়ক।

যদিও অনেক শিক্ষানবিস কোনও বৈশিষ্ট্য দ্বারা বিভ্রান্ত হতে পারে, তবে এটি দীর্ঘমেয়াদী সুবিধার বিরুদ্ধে যে ভারসাম্যপূর্ণ তা মূল্যবান: সূচনাপ্রাপ্তরা বেশি দিন প্রাথমিকভাবে থাকেন না।


2

বাহ, প্রচুর উত্তর-ঠিক-তেমন বিন্দু নয় (যদি আমি খুব সাহসীও হতে পারি), এবং দয়া করে আমাকে ক্ষমা করে দিবেন যদি আমি স্পষ্টতাকে নির্দেশ করছি - বিশেষত শব্দার্থবিজ্ঞানের কথা উল্লেখ না করার জন্য আপনার মন্তব্যের আলোকে, তবে সুস্পষ্ট (স্ট্রস্ট্রপের দৃষ্টিভঙ্গি থেকে, আমি মনে করি) এখনও পোস্ট করা হয়েছে বলে মনে হয় না! :)

পোস্টফিক্স x++একটি অস্থায়ী উত্পাদন করে যা অভিব্যক্তিতে 'উপরের দিকে' পেরিয়ে যায়, যখন ভেরিয়েবলটি xপরবর্তীকালে বাড়ানো হয়।

উপসর্গটি ++xএকটি অস্থায়ী অবজেক্ট তৈরি করে না, তবে 'x' বৃদ্ধি করে এবং ফলাফলটি এক্সপ্রেশনটিতে পাস করে।

যারা অপারেটর জানেন তাদের জন্য মানটি সুবিধার্থে।

উদাহরণ স্বরূপ:

int x = 1;
foo(x++); // == foo(1)
// x == 2: true

x = 1;
foo(++x); // == foo(2)
// x == 2: true

অবশ্যই, এই উদাহরণের ফলাফলগুলি অন্য সমতুল্য (এবং সম্ভবত কম তির্যক) কোড থেকে উত্পাদিত হতে পারে।

তাহলে আমাদের পোস্টফিক্স অপারেটর কেন? আমি অনুমান করি কারণ এটি একটি উত্সাহ যা বজায় রয়েছে, তবুও এটি বিভ্রান্তির পরেও এটি তৈরি করে। এটি এমন একটি লিগ্যাসি কনস্ট্রাক্ট যা একবার মূল্যমান হিসাবে অনুধাবন করা হত, যদিও আমি নিশ্চিত নই যে সুবিধার জন্য পারফরম্যান্সের জন্য অনুমিত মানটি এত বেশি ছিল। সেই সুবিধাটি হারিয়ে যায়নি, তবে আমি মনে করি পঠনযোগ্যতার একটি উপলব্ধি বেড়েছে, ফলস্বরূপ অপারেটরের উদ্দেশ্য সম্পর্কে প্রশ্ন রয়েছে।

আমাদের কি আর পোস্টফিক্স অপারেটরের দরকার? সম্ভবত না। এর ফলাফল বিভ্রান্তিকর এবং বোধগম্যতার জন্য বাধা তৈরি করে। কিছু ভাল কোডার অবশ্যই তাৎক্ষণিকভাবে জানতে পারবেন কোথায় এটি দরকারী হিসাবে পাওয়া যায়, প্রায়শই এমন জায়গাগুলিতে যেখানে এটির অদ্ভুতভাবে "পার্ল-এস্কে" সৌন্দর্য থাকে। সেই সৌন্দর্যের ব্যয় হ'ল পঠনযোগ্যতা।

আমি সম্মত হই যে সুস্পষ্ট কোডের স্বল্পতা, পাঠযোগ্যতা, বোধগম্যতা এবং রক্ষণাবেক্ষণযোগ্যতার তুলনায় সুবিধা রয়েছে। ভাল ডিজাইনার এবং পরিচালকরা এটি চান।

তবে, একটি নির্দিষ্ট সৌন্দর্য আছে যা কিছু প্রোগ্রামার স্বীকৃতি দেয় যে তারা সুন্দর সরলতার জন্য খাঁটি জিনিসগুলি সহ কোড তৈরি করতে উত্সাহিত করে - যেমন পোস্টফিক্স অপারেটর - কোন কোডটি তারা অন্যথায় কখনও ভাবেননি - বা বৌদ্ধিকভাবে উদ্দীপক হিসাবে খুঁজে পেয়েছিল। এটির জন্য একটি নির্দিষ্ট কিছু রয়েছে যা করুণার পরেও কেবল এটি আরও সুন্দর করে তোলে more

অন্য কথায়, কিছু লোক while (*dst++ = *src++);সহজেই আরও সুন্দর সমাধান বলে মনে করেন, এমন একটি জিনিস যা আপনার শ্বাসকে তার সরলতার সাথে দূরে সরিয়ে নিয়ে যায়, ঠিক তেমনই এটি ক্যানভাসে ব্রাশ হয়ে থাকে। আপনি সৌন্দর্যের প্রশংসা করতে ভাষা বোঝার জন্য বাধ্য হন যে কেবল এটির মহিমা বাড়িয়েছে।


3
আরও সুন্দর সমাধান হতে "+1" কিছু লোক খুঁজে পান (* ডিএসটি ++ = * এসসিআর ++); স্পষ্টভাবে. যে লোকেরা সমাবেশের ভাষা বোঝেন না তারা সত্যই বুঝতে পারেন না যে সি কতটা মার্জিত হতে পারে তবে সেই নির্দিষ্ট কোড স্টেটমেন্টটি একটি জ্বলজ্বল তারা।
টিন ম্যান

"আমাদের কি আর পোস্টফিক্স অপারেটরের দরকার? সম্ভবত না।" - আমি এখানে টিউরিং মেশিনের কথা চিন্তা করতে সহায়তা করতে পারি না। আমাদের কি কখনও স্বয়ংক্রিয় চলক, forস্টেটমেন্ট, হেক, এমনকি while(আমাদের gotoসর্বোপরি আছে) দরকার আছে?

@ বারেন্ড: হা! বন্ধের কল্পনা করুন! বন্ধ! মানহানিকর! লল
ব্রায়ান এম হান্ট

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

2

আসুন কর্নিগান এবং রিচি মূল ন্যায়সঙ্গততা দেখুন (মূল কে ও আর পৃষ্ঠা পৃষ্ঠা 42 এবং 43):

অস্বাভাবিক দিকগুলি হ'ল ++ এবং - উপসর্গ হিসাবে বা পোস্টফিক্স হিসাবে ব্যবহৃত হতে পারে। (...) সেই প্রসঙ্গে যেখানে কোনও মান চায় না (..) স্বাদ অনুসারে উপসর্গ বা পোস্টফিক্স নির্বাচন করুন। তবে htere এমন পরিস্থিতি যেখানে এক বা অন্যটিকে বিশেষভাবে বলা হয়।

" আরও কমপ্যাক্ট " কোড লেখার সুস্পষ্ট লক্ষ্য সহ কিছু উদাহরণের সাহায্যে পাঠ্যটি সূচকের অভ্যন্তরে ইনক্রিমেন্ট ব্যবহার করে continues সুতরাং এই অপারেটরগুলির পেছনের কারণটি হ'ল আরও কমপ্যাক্ট কোডের সুবিধা।

তিনটে উদাহরণ দেওয়া ( squeeze(), getline()এবং strcat()) ইন্ডেক্স ব্যবহার এক্সপ্রেশন মধ্যে শুধুমাত্র পোস্টসাফিক্স ব্যবহার করুন। লেখকগণ কোডটিকে একটি দীর্ঘ সংস্করণের সাথে তুলনা করেন যা এমবেডড ইনক্রিমেন্ট ব্যবহার করে না। এটি নিশ্চিত করে যে ফোকাস কমপ্যাক্টনেসে রয়েছে।

কে ওআরআর ১১২ পৃষ্ঠায় হাইলাইট করুন, পয়েন্টার ডেরেফারেন্সিং (যেমন *--pএবং *p--) এর সাথে এই অপারেটরগুলির ব্যবহার । এর পরে আর কোনও উদাহরণ দেওয়া হয়নি, তবে তারা আবার স্পষ্ট করে দেয় যে সুবিধাটি কমপ্যাক্টনেস।

প্রিফিক্স উদাহরণস্বরূপ সূচক হ্রাস বা প্রান্ত থেকে শেষ থেকে পয়েন্টার হ্রাস যখন সাধারণত ব্যবহৃত হয়।

 int i=0; 
 while (i<10) 
     doit (i++);  // calls function for 0 to 9  
                  // i is 10 at this stage
 while (--i >=0) 
     doit (i);    // calls function from 9 to 0 

1

আমি প্রতিজ্ঞা যে সঙ্গে মতানৈক্য যাচ্ছি ++p, p++, একরকম পড়তে কঠিন বা তা স্পষ্ট নয়। একটির অর্থ "ইনক্রিমেন্ট পি এবং তারপরে পি পড়ুন", অন্যটির অর্থ "পঠন পি এবং তারপরে ইনক্রিমেন্ট পি"। উভয় ক্ষেত্রেই কোডের অপারেটরটি কোডের ব্যাখ্যাটিতে ঠিক যেখানে রয়েছে তাই আপনি যদি বোঝেন তবে এর ++অর্থ কী , আপনি ফলাফলের কোডটির অর্থ কী তা জানেন।

আপনি সময়সীমার কোড ব্যবহার তৈরি করতে পারেন কোন সিনট্যাক্স, কিন্তু আমি একটি মামলা এখানে দেখছি না যে p++/ ++pহয় মজ্জাগতভাবে বিভ্রান্তিকর।


1

এটি বৈদ্যুতিক ইঞ্জিনিয়ারের পিওভি থেকে এসেছে:

অনেক প্রসেসর রয়েছে যা শেষ-প্রথম-ফার্স্ট আউট (LIFO) স্ট্যাক বজায় রাখার উদ্দেশ্যে অন্তর্নিহিত পোস্ট-ইনক্রিমেন্ট এবং প্রাক-হ্রাস অপারেটরগুলি তৈরি করে।

এটি হতে পারে:

 float stack[4096];
 int stack_pointer = 0;

 ... 

 #define push_stack(arg) stack[stack_pointer++] = arg;
 #define pop_stack(arg) arg = stack[--stack_pointer];

 ...

আমি জানি না, তবে এ কারণেই আমি প্রিফিক্স এবং পোস্টফিক্স বর্ধিত অপারেটর উভয়কেই দেখতে আশা করব।


1

কমপ্যাক্টনেস সম্পর্কে ক্রিস্টোফের বক্তব্যটি আন্ডারলাইন করতে, আমি ভি 6 থেকে আপনার সমস্ত কোড প্রদর্শন করতে চাই। এটি মূল সি সংকলকের অংশ, http://minnie.tuhs.org/cgi-bin/utree.pl?file=V6/usr/source/c/c00.c থেকে :

/*
 * Look up the identifier in symbuf in the symbol table.
 * If it hashes to the same spot as a keyword, try the keyword table
 * first.  An initial "." is ignored in the hash.
 * Return is a ptr to the symbol table entry.
 */
lookup()
{
    int ihash;
    register struct hshtab *rp;
    register char *sp, *np;

    ihash = 0;
    sp = symbuf;
    if (*sp=='.')
        sp++;
    while (sp<symbuf+ncps)
        ihash =+ *sp++;
    rp = &hshtab[ihash%hshsiz];
    if (rp->hflag&FKEYW)
        if (findkw())
            return(KEYW);
    while (*(np = rp->name)) {
        for (sp=symbuf; sp<symbuf+ncps;)
            if (*np++ != *sp++)
                goto no;
        csym = rp;
        return(NAME);
    no:
        if (++rp >= &hshtab[hshsiz])
            rp = hshtab;
    }
    if(++hshused >= hshsiz) {
        error("Symbol table overflow");
        exit(1);
    }
    rp->hclass = 0;
    rp->htype = 0;
    rp->hoffset = 0;
    rp->dimp = 0;
    rp->hflag =| xdflg;
    sp = symbuf;
    for (np=rp->name; sp<symbuf+ncps;)
        *np++ = *sp++;
    csym = rp;
    return(NAME);
}

এটি এমন কোড যা সমীজদাতকে ভাল স্টাইলে শিক্ষারূপে পাস করা হয়েছিল, এবং আমরা আজ কখনও এটিকে লিখব না। কত পার্শ্ব প্রতিক্রিয়া মধ্যে বস্তাবন্দী করা হয়েছে তাকান ifএবং whileঅবস্থা এবং বিপরীতভাবে, কিভাবে উভয় forলুপ একটি বৃদ্ধি অভিব্যক্তি আছে না, কারণ যে লুপ শরীরের সম্পন্ন। যখন একেবারে প্রয়োজনীয় হয় তখন ব্লকগুলি কেবল ধনুর্বন্ধকে আবদ্ধ হয় wra

এর একটি অংশটি হ'ল ম্যানুয়াল মাইক্রো-অপ্টিমাইজেশানটি ছিল যা আমরা আজ আমাদের জন্য সংকলকটি আশা করি, তবে আমি এই অনুমানটিও সামনে রেখে বলব যে যখন কম্পিউটারে আপনার সম্পূর্ণ ইন্টারফেসটি একক 80x25 গ্লাস টিটি হবে তখন আপনি আপনার কোডটি চান যতটা সম্ভব ঘন হওয়া যাতে আপনি একই সাথে আরও কিছু দেখতে পান।

(সমস্ত কিছুর জন্য গ্লোবাল বাফার ব্যবহার সম্ভবত সমাবেশ ভাষাতে কারও দাঁত কাটানো একটি হ্যাংওভার))


যত্ন সহকারে পরিচালনা করুন: "ihash = + * এসপি ++;" এক পর্যায়ে সিতে কেবলমাত্র + = ছিল না তবে = + অপারেটরও ছিল। আজ, = + একটি অ্যাসাইনমেন্ট অপারেটর, তারপরে একটি আনরি প্লাস যা কিছু করে না, তাই এটি "ihash = * sp; sp + = 1;" এর সমতুল্য;
gnasher729

@ gnasher729 হ্যাঁ, এবং পরে এটি রয়েছে rp->hflag =| xdflg, যা আমার বিশ্বাস একটি আধুনিক সংকলকটিতে একটি সিনট্যাক্স ত্রুটি হবে। "কিছুটা সময়" হ'ল ভি 6, যেমনটি ঘটে; +=ভি 7 এ হ্যাভেন্ড গঠনের পরিবর্তন । (ভি 6 সংকলকটি কেবলমাত্র গ্রহণযোগ্য =+, যদি আমি এই কোডটি সঠিকভাবে পড়ছি - একই ফাইলটিতে প্রতীক () দেখুন
zwol

-1

সম্ভবত আপনার প্রসাধনী সম্পর্কেও চিন্তা করা উচিত।

while( i++ )

যুক্তিযুক্ত "তুলনায় ভাল দেখায়"

while( i+=1 )

কোনও কারণে পোস্ট-ইনক্রিমেন্ট অপারেটরটি খুব আবেদনময়ী দেখায়। এটি সংক্ষিপ্ত, এটি মিষ্টি এবং এটি 1 দ্বারা সমস্ত কিছু বাড়িয়ে তোলে উপসর্গের সাথে এটির তুলনা করুন:

while( ++i )

"পিছনে তাকান" তাই না? আপনি কখনই গণিতের কোনও বৃহত্তর চিহ্ন দেখতে পাচ্ছেন না, ব্যতিরেকে যখন কারওর ইতিবাচক ( +0বা এরকম কিছু) নির্দিষ্ট করে দেওয়া হয়। আমরা OBJECT + কিছু দেখতে অভ্যস্ত

গ্রেডিংয়ের সাথে কি কিছু করার আছে? এ, এ +, এ ++? আমি আপনাকে বলতে পারি যে আমি প্রথমে চমৎসিত হয়েছিলাম যে পাইথন মানুষ operator++তাদের ভাষা থেকে সরিয়ে দিয়েছে!


1
আপনার উদাহরণগুলি একই কাজ করে না। i++মূল মান i, এবং i+=1এবং ++iমূল মান iপ্লাস 1. আপনি এই বিষয় নিয়ন্ত্রণ প্রবাহ বিনিময়ে মান ব্যবহার করছেন থেকে,।
ডেভিড থর্নলি

হ্যাঁ আপনি ঠিক. তবে আমি এখানে কেবল পঠনযোগ্যতার দিকে তাকিয়ে আছি।
বোবোবোবো

-2

পিছনে গণনা 9 থেকে 0 সহ:

for (unsigned int i=10; i-- > 0;)  {
    cout << i << " ";
}

বা লুপ করার সময় সমতুল্য।


1
কীভাবে for (unsigned i = 9; i <= 9; --i)?
ফ্রেডওভারফ্লো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.