আমি ++ কেন করেছি; i--; একে অপরের পরে?


164

আমি ১৯৯ released সালে প্রকাশিত এনএম্যাপের উত্স কোডটির দিকে চেয়ে ছিলাম এবং কোডটির এই বিভাগটি আমার কাছে কিছুটা অদ্ভুত বলে মনে হয়েছে:

int i=0, j=0,start,end;
char *expr = strdup(origexpr);
ports = safe_malloc(65536 * sizeof(short));
i++;                                         /* <<<<<< */
i--;                                         /* <<<<<< */
for(;j < exlen; j++) 
  if (expr[j] != ' ') expr[i++] = expr[j]; 
expr[i] = '\0';

কেন হবে i++;এবং তারপর i--;একে অপরের পর ঠিক আছে? iহয় 0, তারপর i++পরিণত iহয় 1। এর পর, i--দেখা যাচ্ছে iকরার 0

মূল উত্স কোডের লিঙ্ক। সন্ধান করা:

i++;
i--;

এই কি জন্য কেউ ব্যাখ্যা করতে পারেন?


25
লেখককে জিজ্ঞাসা করুন
ডাবলার

8
আমি অনুমান করতে পারি যে এগুলি কিছু পরীক্ষামূলক বা ডিবাগিং কোডের অংশ ছিল, যা পরে লেখক মুছে ফেলতে ভুলে গিয়েছিলেন।
ন্যাট এল্ড্রেজ

6
স্পষ্টতই আপনাকে বিভ্রান্ত করার কারণ এটিই একমাত্র উদ্দেশ্য :-) একটি ছোট্ট সম্ভাবনা রয়েছে যে এটি কিছু প্রাচীন সংকলকটিতে কিছু সংকলক বাগের চারপাশে কাজ করে, সে ক্ষেত্রে আমাদের এই কারণটি বলার বিষয়ে মন্তব্য করা উচিত ছিল।
gnasher729

18
@ রিংØ: মজা করার জন্য আমি গডিবল্টে জিডিসি 1.27, সার্কা 1988 দিয়ে চেষ্টা করেছি: Godbolt.org/z/yYyFrQ । (এটি আধুনিক সিস্টেমের শিরোনামগুলির সাথে কাজ করে না তাই আমাকে সমস্ত স্ট্যান্ডার্ড লাইব্রেরির ক্রিয়াকলাপটি নিজেই ঘোষণা করতে হয়েছিল)) তবে -Oএটি সত্যই এই বিবৃতিগুলিকে অপ্টিমাইজ করে।
ন্যাট এল্ড্রেজ

21
এর অর্থ প্রোগ্রামারটি লাইনের মাধ্যমে অর্থ প্রদান করেছিল ...
টনিক

উত্তর:


152

এটি একটি বাগ ছিল। এই লাইনগুলি একসাথে iঅপরিবর্তিত হওয়ার ফলস্বরূপ , তাই তাদের সেখানে থাকা উচিত হয়নি।

এনএমএপ প্রবর্তনকারী লিঙ্কযুক্ত নিবন্ধটি সেপ্টেম্বর 1 1997 এ প্রকাশিত হয়েছিল। আপনি যদি https://svn.nmap.org/nmap এ এনএমএপের জন্য এসভিএন সংগ্রহস্থলটি দেখেন তবে 10 ফেব্রুয়ারী 1998-এ চেক করা প্রাথমিক সংশোধনীটিতে এই লাইনগুলি নেই:

int i=0, j=0,start,end;
char *expr = strdup(origexpr);
char *mem = expr;

ports = safe_malloc(65536 * sizeof(short));
for(;j < exlen; j++) 
  if (expr[j] != ' ') expr[i++] = expr[j]; 
expr[i] = '\0';

সুতরাং এটি প্রাথমিকভাবে এনএমএপ উত্স কোড এবং এসভিএন-তে প্রাথমিক চেকিন প্রকাশের মধ্যে লেখক খুঁজে পেয়েছেন এবং ঠিক করেছেন।


1
হুম এই পৃষ্ঠায় <pre>নিবন্ধটির চারপাশেও হারিয়ে যাওয়া ট্যাগগুলি; ক্রোমের পরিদর্শক প্রকাশ করেছেন যে কীভাবে এটি ডিওএম নির্মাণের সময় কিছু দস্তাবেজ ম্যাঙ্গেলিংয়ের দিকে নিয়ে যায়;)
উইংস উইথ উইং উইংস

4
এটি পাঠকদের বিভ্রান্ত করে, যা সম্পূর্ণ অনিচ্ছাকৃত। আমি বলতে চাই এটি স্পষ্টত একটি বাগ। ;-)
সার্গুট

2
@ সের্গুট উইকিপিডিয়া আপনার সাথে একমত নয়, তবে এই ব্লগ পোস্টটি করেছে , এবং আমি
এতেও ঝুঁকে পড়েছি

4
এখন যদি iকোনও অন্তর্নিহিত না হলেও অপারেটর ওভারলোডগুলির সাথে কিছু অভিনব শ্রেণি ছিল, তবে এটি সম্ভব (যদিও অসম্ভব এবং সাধারণত দুর্বল কোডিং অনুশীলনের লক্ষণ) যা এর কিছু পার্শ্ব প্রতিক্রিয়া হতে পারে। (কেবলমাত্র এটি সি ++ অবশ্যই থাকলে প্রযোজ্য))
ডারেল হফম্যান

5
সম্ভবত লক্ষণীয় যে কয়েকটি প্রসঙ্গে (মেমরি-ম্যাপযুক্ত আইও), একটি ভেরিয়েবল পরিবর্তন করলে বাহ্যিক প্রভাব থাকতে পারে।
নুলরোমো

40

এটা অকাজের. এটি একেবারে কিছুই করে না।

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

আমি অনুমান করছি যে হয় এক i++বা i--একটি পরিবর্তন চালু হয় এবং অন্যান্য অন্য চালু করা হয়।

আমার কাছে পরিচয়ের বিন্দুটি খুঁজে পাওয়ার কোনও উপায় নেই, যদিও প্রাথমিক উত্স প্রকাশ এবং প্রথম এসভিএন সংশোধনের মধ্যে কোনও সংশোধন ইতিহাস ছিল না।


14
আমি মনে করি ডিবাগিং কোড সম্পর্কে জল্পনা সঠিক। আপনি যে যেখানে আশা করবেন কেবল ব্রেকপয়েন্ট পেতে পেতে আমি বিভিন্ন ধরণের ডিবাগিং কোড দেখেছি।
নাথান Goings

9

অপ-অপ্টিমাইজ করা সংকলক, বা হার্ডওয়্যার পার্শ্ব প্রতিক্রিয়াগুলি স্বীকৃত একের জন্য, i++; i-- ক্রমটি আমাকে স্মৃতি থেকে পড়তে বাধ্য করবে, তারপরে পুনরায় লিখিত হবে, লুপের মধ্য দিয়ে নেওয়া পথ নির্বিশেষে এবং যদি নেস্ট করে।

সমান্তরাল প্রক্রিয়াকরণে, কখনও কখনও সংকলক হ্যাকগুলি বৈশ্বিক অনুলিপিগুলির পরিবর্তে ভেরিয়েবলের নিজস্ব স্থানীয় কপি ব্যবহার করে তা নিশ্চিত করার জন্য সংকলক হ্যাক নেওয়া হয়।

যেহেতু উদাহরণটি একটি কোড স্নিপেট, কোনওটি ব্যবহৃত সংকলক, প্রত্যাশিত অপারেটিং সিস্টেম / হার্ডওয়্যার নির্ধারণ করতে পারে না বা এটি কোনও কোড সিকোয়েন্স / ফাংশনে রয়েছে যা একটি স্বাধীন থ্রেড হিসাবে কার্যকর করা সম্ভব।

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


1
তবে কেন কেবল এটিকে অস্থির হিসাবে ঘোষণা করবেন না?
বনাম

6
iস্থানীয় পরিবর্তনশীল হিসাবে ঘোষণাটি উপরের কোডে দেখানো হয়েছে এবং i++; i--লাইনগুলি যেখানে আছে সেখানে অন্য থ্রেডের মাধ্যমে এটির প্রবেশ করার কোনও উপায় নেই ।
ইন্টারজয়

@vsz বরং আমি মনে করি তার অর্থ iহ'ল বাধ্যতামূলকভাবে অস্থিতিশীল হতে বাধ্য করা হয়েছে। যদিও আমি সি বা সি ++ তে থ্রেডিংয়ের সাথে মোকাবিলা করি নি, সুতরাং এটি কীভাবে অস্থির হিসাবে বিবেচনা করা যায় এবং কীভাবে i++; i--এটি দমন করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই।
ডিম হ্যানস

অস্থির থ্রেড-সুরক্ষা ছাড়াও অন্যান্য উদ্দেশ্য রয়েছে। সংকলক এটি অপ্টিমাইজ করবে না তা নিশ্চিত করতে এটি ডিবাগ করার সময়ও ব্যবহার করা যেতে পারে।
বনাম

2

আমি আপনাকে কেবল আপডেট কোডটি পরীক্ষা করার পরামর্শ দেব। আপনি যদি তার ঠিক পরে (i = 2 + 1) ব্যবহার করেন (আই -1) যা কোনও অর্থ দেয় না। I এর মান অপরিবর্তিত রয়েছে। আপনি যে কোনও সি বা সি ++ সংকলক ব্যবহার করে এটি চেষ্টা করতে পারেন। এমনকি অন্য কোনও ভাষায়ও এটি একই is আমি ভুল কিনা ঠিক তা দেখার জন্য সংকলকটিতে কোডটি চালান এবং আমি ভুল উত্তর দিচ্ছি কিনা তা আমাকে জানান।

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