সি: ++ i এবং i ++ এর মধ্যে পার্থক্য কী?


887

সি তে, ব্যবহার ++iএবং এর মধ্যে পার্থক্য কী i++এবং কোন forলুপের ইনক্রিমেন্টেশন ব্লকে ব্যবহার করা উচিত ?


10
আসল পোস্টারটি আগ্রহী তা নিশ্চিত নয়, তবে সি ++ এর মধ্যে পারফরম্যান্সের পার্থক্য যথেষ্ট পরিমাণে হতে পারে, যেহেতু কোনও ব্যবহারকারী সংজ্ঞায়িত ধরণের জন্য অস্থায়ী অবজেক্ট তৈরি করা ব্যয়বহুল হতে পারে।
ফ্রয়েন্ডে

উত্তর:


1098
  • ++iএর মান বাড়িয়ে তুলবে iএবং তারপরে বর্ধিত মানটি প্রদান করবে।

     i = 1;
     j = ++i;
     (i is 2, j is 2)
    
  • i++এর মান বাড়িয়ে তুলবে i, তবে iবাড়ানোর আগে যে মূল মূল্য ছিল তা ফেরত দেবে ।

     i = 1;
     j = i++;
     (i is 2, j is 1)
    

একটি forলুপ জন্য, হয় কাজ করে। ++iআরও সাধারণ বলে মনে হচ্ছে, সম্ভবত এটিই কে ওআরটিতে ব্যবহৃত হয় ।

যাই হোক না কেন, গাইডলাইনটি " ++iবেশি পছন্দ করুন" অনুসরণ করুন i++এবং আপনার কোনও ভুল হবে না।

এর দক্ষতা ++iএবং সম্পর্কে বেশ কয়েকটি মন্তব্য রয়েছে i++। যে কোনও নন-স্টুডেন্ট-প্রজেক্ট সংকলনে, পারফরম্যান্সের পার্থক্য থাকবে না। আপনি উত্পন্ন কোডটি দেখে যাচাই করতে পারেন, যা অভিন্ন হবে।

দক্ষতার প্রশ্নটি আকর্ষণীয় ... এখানে একটি উত্তরের আমার চেষ্টা: সি + তে আই ++ এবং ++ i এর মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে কি?

@ অনফ্রেন্ড নোট হিসাবে , এটি একটি সি ++ অবজেক্টের জন্য পৃথক, যেহেতু operator++()একটি ফাংশন এবং সংকলক অন্তর্বর্তী মান ধরে রাখতে একটি অস্থায়ী বস্তুর তৈরি অপ্টিমাইজ করতে জানতে পারে না।


6
এই আবহাওয়ার আবহাওয়ার শেষ অবস্থাটি পৌঁছানোর পরে লুপটি আরও একবার চলবে না? উদাহরণস্বরূপ, for(int i=0; i<10; i++){ print i; } এটি for(int i=0; i<10; ++i){ print i; } আমার বোঝার চেয়ে আলাদা হবে না যে কিছু ভাষা আপনাকে ব্যবহার করবে তার উপর নির্ভর করে বিভিন্ন ফলাফল দেয়।
aVeRTRAC

27
jonnyflash, উভয়ই একইভাবে কাজ করবে, যেহেতু i এবং মুদ্রণের বৃদ্ধি বিভিন্ন বিবৃতিতে রয়েছে। সি-স্টাইল ++ সমর্থন করে এমন কোনও ভাষার ক্ষেত্রে এটি হওয়া উচিত। একই স্টেটমেন্টে অপারেশনের মান ব্যবহার করার সময় ++ i এবং i ++ এর মধ্যে কেবলমাত্র পার্থক্য।
মার্ক হ্যারিসন

16
যেহেতু বেশিরভাগ ক্ষেত্রে তারা অভিন্ন কোড তৈরি করে, আমি পছন্দ করি i++কারণ এটি "অপারেন্ড-অপারেটর" ফর্মের, একটি অ্যাসাইনমেন্ট "অপারেন্ড-অপারেটর-মান" of অন্য কথায়, লক্ষ্য অপারেন্ডটি যেমন একটি অ্যাসাইনমেন্ট স্টেটমেন্টে থাকে ঠিক তেমনই অভিব্যক্তিটির বাম দিকে থাকে।
ডেভিড আর ট্রিবল

2
@MarkHarrison, এটা অভিন্নরুপে না কাজ করবে কারণ i++এবং print iবিভিন্ন বিবৃতি আছে, কিন্তু কারণ i++;এবং i<10আছে। @ জনিফ্ল্যাশের মন্তব্যটি ভিত্তি নয়। ধরুন আপনার আছে for(int i=0; i++<10){ print i; }এবং for(int i=0; ++i<10){ print i; }। @ Jhnnyflash প্রথম মন্তব্যে বর্ণিতভাবে এগুলি ভিন্নভাবে পরিচালিত হবে।
আদম

3
@ স্যাম, কারণ লুপের জন্য একটি সাধারণ ক্ষেত্রে ++ i অংশে কোনও পার্শ্ব প্রতিক্রিয়া নেই (উদাহরণস্বরূপ, অ্যাসাইনমেন্ট)।
মার্ক হ্যারিসন

175

i ++ পোস্ট বর্ধন হিসাবে পরিচিত যেখানে ++ i বলা হয় প্রাক বৃদ্ধি।

i++

i++পোস্ট ইনক্রিমেন্ট কারণ iক্রিয়াকলাপ শেষ হওয়ার পরে এটির মান 1 বৃদ্ধি করে।

নীচের উদাহরণটি দেখতে দিন:

int i = 1, j;
j = i++;

এখানে j = 1কিন্তু মান i = 2। এখানে এর আগে প্রথমে iনির্ধারিত হবে এর মান বাড়ানো হবে।ji

++i

++iপূর্ববৃদ্ধি হ'ল কারণ এটি iঅপারেশনের আগে 1 এর মান বৃদ্ধি করে। এর অর্থ j = i;কার্যকর হবে পরে i++

নীচের উদাহরণটি দেখতে দিন:

int i = 1, j;
j = ++i;

এখানে j = 2কিন্তু মান i = 2। এখানে এর মান বাড়ানোর পরে iনির্ধারিত হবে । একইভাবে আগে মৃত্যুদন্ড কার্যকর করা হবে ।jii++ij=i;

আপনার প্রশ্নের জন্য কোনটি লুপের জন্য বৃদ্ধি ব্লকে ব্যবহার করা উচিত? উত্তরটি হ'ল, আপনি যে কোনও একটি ব্যবহার করতে পারেন .. তাতে কিছু আসে যায় না। এটি আপনার লুপের জন্য একই নম্বর। সময়ের।

for(i=0; i<5; i++)
   printf("%d ",i);

এবং

for(i=0; i<5; ++i)
   printf("%d ",i);

উভয় লুপ একই আউটপুট উত্পাদন করবে। অর্থাত 0 1 2 3 4

আপনি কেবল এটি কোথায় ব্যবহার করছেন তা বিবেচ্য।

for(i = 0; i<5;)
    printf("%d ",++i);

এই ক্ষেত্রে আউটপুট হবে 1 2 3 4 5


1
উপসর্গ এবং পোস্ট-ফিক্সের পরে ভেরিয়েবলগুলির সূচনা বুঝতে সহায়তা করে। ধন্যবাদ।
আব্দুল আলীম শাকির

42

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


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

আমি নিশ্চিত নই যে "আজকাল সংকলকগণ ... এই বিষয়গুলির যত্ন নিন" সর্বজনীন সত্য। একটি কাস্টম operator++(int)(পোস্টফিক্স সংস্করণ) এর মধ্যে কোডটিতে বেশ কিছুটা একটি অস্থায়ী তৈরি করতে হয় যা ফিরে আসবে। আপনি কি নিশ্চিত যে কম্পাইলাররা সর্বদা এটি অপ্টিমাইজ করতে পারে?
পিটার - মনিকা পুনরায়

35

++i মান বৃদ্ধি করে, তারপরে এটি প্রদান করে।

i++ মান প্রদান করে এবং তারপরে এটি বৃদ্ধি করে।

এটি একটি সূক্ষ্ম পার্থক্য।

লুপের জন্য, ব্যবহার করুন ++iকারণ এটি কিছুটা দ্রুত। i++কেবলমাত্র ফেলে দেওয়া হবে এমন একটি অতিরিক্ত অনুলিপি তৈরি করবে।


23
আমি কোনও সংকলক সম্পর্কে অবগত নই যেখানে এটি কমপক্ষে পূর্ণসংখ্যার জন্য কোনও পার্থক্য করে।
blabla999

4
এটি দ্রুত হয় না । মানগুলি উপেক্ষা করা হয় (কেবলমাত্র পার্শ্ব প্রতিক্রিয়া কার্যকর) এবং সংকলক হুবহু একই কোড উত্পন্ন করতে পারে / করবে।
ওয়াইল্ডপ্লাজার

31

i++: এই দৃশ্যে প্রথমে মান নির্ধারিত হয় এবং তারপরে বৃদ্ধি ঘটে।

++i: এই দৃশ্যে প্রথমে ইনক্রিমেন্ট সম্পন্ন হয় এবং তারপরে মান নির্ধারিত হয়

নীচে চিত্রের দৃশ্যায়ন রয়েছে এবং এখানে একটি দুর্দান্ত ব্যবহারিক ভিডিও রয়েছে যা একই চিত্র প্রদর্শন করে।

এখানে চিত্র বর্ণনা লিখুন


আপনি কীভাবে কিছুটা বরাদ্দ নন?
কাউটি

@ কেউটি আপনি কোনও ভেরিয়েবলের জন্য বরাদ্দ না হওয়া কোনও রেজিস্টার বাড়িয়ে দিতে পারেন।
Polluks

20

কারণ ++i পারেন সামান্য দ্রুত চেয়ে i++করা হয় যে, i++আগে এটি বৃদ্ধি পরার তোমার মান একটি স্থানীয় অনুলিপি প্রয়োজন হতে পারে, যখন ++iকরে না। কিছু ক্ষেত্রে, কিছু সংকলক যদি সম্ভব হয় তবে এটি অপ্টিমাইজ করবে ... তবে এটি সর্বদা সম্ভব নয় এবং সমস্ত সংকলক এটি করেন না।

আমি কম্পাইলার অপ্টিমাইজেশনের উপর খুব বেশি নির্ভর না করার চেষ্টা করি, তাই আমি রায়ান ফক্সের পরামর্শটি মেনে চলি: যখন আমি উভয় ব্যবহার করতে পারি, তখন আমি ব্যবহার করি ++i


11
সি প্রশ্নের উত্তর সি ++ এর জন্য -1। iআপনি যখন কোনও বিবৃতি লিখবেন তখন মান 1 এর চেয়ে বেশি মানের কোনও "স্থানীয় অনুলিপি" নেই 1;
আর .. গিটহাব বন্ধ হেল্পিং আইসিসি

14

কোনও লুপে ব্যবহারের কার্যকর ফলাফলটি অভিন্ন। অন্য কথায়, লুপ দুটি ক্ষেত্রে একই একই কাজ করবে।

দক্ষতার দিক থেকে, আমি ++ ওভার ++ i বেছে নেওয়ার সাথে জরিমানা থাকতে পারে। ভাষা বৈশিষ্টের ক্ষেত্রে, পোস্ট-ইনক্রিমেন্ট অপারেটর ব্যবহার করে অপারেটর যে মানটির উপর আচরণ করছে তার একটি অতিরিক্ত কপি তৈরি করা উচিত। এটি অতিরিক্ত অপারেশনের উত্স হতে পারে।

তবে পূর্ববর্তী যুক্তি নিয়ে আপনার দুটি প্রধান সমস্যা বিবেচনা করা উচিত।

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

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

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

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


13

তারা উভয়ই সংখ্যা বৃদ্ধি করে। ++iসমতূল্য i = i + 1

i++এবং ++iখুব মিল কিন্তু ঠিক একই নয়। উভয়ই সংখ্যা বৃদ্ধি করে, তবে ++iবর্তমান প্রকাশের আগে মূল্যায়ন করার আগে সংখ্যাটি বৃদ্ধি করে, যেখানে i++অভিব্যক্তিটি মূল্যায়নের পরে সংখ্যা বৃদ্ধি করে।

উদাহরণ:

int i = 1;
int x = i++; //x is 1, i is 2
int y = ++i; //y is 3, i is 3

8

++i(প্রিফিক্স অপারেশন): বৃদ্ধি এবং তারপর মান নির্ধারণ
(যেমন): int i = 5, int b = ++i এই ক্ষেত্রে, 6 থেকে 7 এবং তাই প্রথম এবং তারপর বাড়তি b নির্ধারিত হয়।

i++(Postfix অপারেশন): নির্ধারণ এবং তারপর মান বৃদ্ধি
(যেমন): int i = 5, int b = i++ এই ক্ষেত্রে, 5 6 এবং তাই প্রথম এবং তারপর বাড়তি b নির্ধারিত হয়।

লুপের ক্ষেত্রে অন্তর্ভুক্ত: i++বেশিরভাগ ক্ষেত্রে ব্যবহৃত হয় কারণ সাধারণত আমরা iলুপের জন্য বাড়ানোর আগে শুরুর মানটি ব্যবহার করি । তবে আপনার প্রোগ্রামের যুক্তির উপর নির্ভর করে এটি ভিন্ন হতে পারে।


7

++i: প্রাক-বর্ধনশীল অন্যটি হ'ল পোস্ট-ইনক্রিমেন্ট।

i++: উপাদান পায় এবং তারপরে এটি বৃদ্ধি করে।
++i: বৃদ্ধি i এবং তারপরে উপাদানটি প্রদান করে returns

উদাহরণ:

int i = 0;
printf("i: %d\n", i);
printf("i++: %d\n", i++);
printf("++i: %d\n", ++i);

আউটপুট:

i: 0
i++: 0
++i: 2

5

আমি ধরে নিয়েছি আপনি এখন শব্দার্থবিজ্ঞানের পার্থক্য বুঝতে পেরেছেন (যদিও সত্যই আমি অবাক হই যে লোকেরা স্ট্যাক ওভারফ্লো সম্পর্কে পড়ার পরিবর্তে 'অপারেটর এক্স এর অর্থ কী' প্রশ্ন জিজ্ঞাসা করে, আপনি জানেন যে কোনও বই বা ওয়েব টিউটোরিয়াল বা অন্য কিছু)।

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

কোডে আপনি কী বোঝাতে চান তা বলুন।

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

কিউইডি, প্রাক-বর্ধিত সংস্করণটি ব্যবহার করুন:

for (int i = 0; i != X; ++i) ...

5

পার্থক্যটি নীচের এই সাধারণ সি ++ কোড দ্বারা বোঝা যাবে:

int i, j, k, l;
i = 1; //initialize int i with 1
j = i+1; //add 1 with i and set that as the value of j. i is still 1
k = i++; //k gets the current value of i, after that i is incremented. So here i is 2, but k is 1
l = ++i; // i is incremented first and then returned. So the value of i is 3 and so does l.
cout << i << ' ' << j << ' ' << k << ' '<< l << endl;
return 0;

5

মূল পার্থক্য হ'ল

  • i ++ পোস্ট ( বৃদ্ধির পরে ) এবং
  • ++ আমি প্রাক ( বৃদ্ধির আগে )

    • i =1 লুপের ইনক্রিমেন্ট পছন্দ হলে পোস্ট করুন1,2,3,4,n
    • প্রাক i =1 লুপ বৃদ্ধি যদি পছন্দ2,3,4,5,n

5

i ++ এবং ++ i

এই সামান্য কোডটি ইতিমধ্যে পোস্ট করা উত্তরগুলির চেয়ে আলাদা কোণ থেকে পার্থক্যটি কল্পনা করতে সহায়তা করতে পারে:

int i = 10, j = 10;

printf ("i is %i \n", i);
printf ("i++ is %i \n", i++);
printf ("i is %i \n\n", i);

printf ("j is %i \n", j);
printf ("++j is %i \n", ++j);
printf ("j is %i \n", j);

ফলাফলটি হ'ল:

//Remember that the values are i = 10, and j = 10

i is 10 
i++ is 10     //Assigns (print out), then increments
i is 11 

j is 10 
++j is 11    //Increments, then assigns (print out)
j is 11 

পরিস্থিতিতে আগে এবং পরে মনোযোগ দিন।

লুপ জন্য

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

int i, j;

for (i = 0; i <= 3; i++)
    printf (" > iteration #%i", i);

printf ("\n");

for (j = 0; j <= 3; ++j)
    printf (" > iteration #%i", j);

ফলাফলটি হ'ল:

> iteration #0 > iteration #1 > iteration #2 > iteration #3
> iteration #0 > iteration #1 > iteration #2 > iteration #3 

আমি আপনার সম্পর্কে জানি না, তবে কমপক্ষে লুপের জন্য আমি এর ব্যবহারে কোনও পার্থক্য দেখছি না।


5

নিম্নলিখিত সি কোড খণ্ডটি পূর্ব এবং পোস্ট বৃদ্ধি এবং হ্রাস অপারেটরগুলির মধ্যে পার্থক্য চিত্রিত করে:

int  i;
int  j;

বর্ধক অপারেটর:

i = 1;
j = ++i;    // i is now 2, j is also 2
j = i++;    // i is now 3, j is 2

4

প্রাক ক্রিমেন্ট মানে একই লাইনে ইনক্রিমেন্ট। পোস্ট-ইনক্রিমেন্ট মানে লাইন কার্যকর হওয়ার পরে বৃদ্ধি।

int j=0;
System.out.println(j); //0
System.out.println(j++); //0. post-increment. It means after this line executes j increments.

int k=0;
System.out.println(k); //0
System.out.println(++k); //1. pre increment. It means it increments first and then the line executes

এটি যখন ওআর এবং অপারেটরগুলির সাথে আসে তখন এটি আরও আকর্ষণীয় হয়ে ওঠে।

int m=0;
if((m == 0 || m++ == 0) && (m++ == 1)) { //false
/* in OR condition if first line is already true then compiler doesn't check the rest. It is technique of compiler optimization */
System.out.println("post-increment "+m);
}

int n=0;
if((n == 0 || n++ == 0) && (++n == 1)) { //true
System.out.println("pre-increment "+n); //1
}

অ্যারেতে

System.out.println("In Array");
int[] a = { 55, 11, 15, 20, 25 } ;
int ii, jj, kk = 1, mm;
ii = ++a[1]; // ii = 12. a[1] = a[1] + 1
System.out.println(a[1]); //12

jj = a[1]++; //12
System.out.println(a[1]); //a[1] = 13

mm = a[1];//13
System.out.printf ( "\n%d %d %d\n", ii, jj, mm ) ; //12, 12, 13

for (int val: a) {
     System.out.print(" " +val); //55, 13, 15, 20, 25
}

সি ++ পোস্টে / পয়েন্টার ভেরিয়েবলের প্রাক-বৃদ্ধি

#include <iostream>
using namespace std;

int main() {

    int x=10;
    int* p = &x;

    std::cout<<"address = "<<p<<"\n"; //prints address of x
    std::cout<<"address = "<<p<<"\n"; //prints (address of x) + sizeof(int)
    std::cout<<"address = "<<&x<<"\n"; //prints address of x

    std::cout<<"address = "<<++&x<<"\n"; //error. reference can't re-assign because it is fixed (immutable)
}

4

কিছুদিন:

++iএবং i++যদি আপনি কোনও ফাংশনে এগুলি লিখছেন না তবে একই কাজ করে। আপনি যদি এর মতো কিছু ব্যবহার করেন function(i++)বা function(++i)পার্থক্যটি দেখতে পারেন।

function(++i)প্রথম বর্ধিত i কে 1 বলে, এর পরে এটি iনতুন মান সহ ফাংশনে রাখবে।

function(i++)1 দ্বারা iযে বৃদ্ধি পরে ফাংশন প্রথম রাখে বলে i

int i=4;
printf("%d\n",pow(++i,2));//it prints 25 and i is 5 now
i=4;
printf("%d",pow(i++,2));//it prints 16 i is 5 now

2
পার্থক্যটি আসলে ফাংশন কলগুলিতে আবদ্ধ নয় (এবং আপনি ফাংশন কল না করেই পার্থক্যটি চিহ্নিত করতে পারেন)। কোনও ফাংশন কল জড়িত না হওয়ার পরেও int j = ++i;এবং int k = i++;তার মধ্যে পার্থক্য রয়েছে ।
জোনাথন লেফলার

3

কেবলমাত্র পার্থক্য হ'ল ভেরিয়েবলের বর্ধিতকরণ এবং অপারেটর যে মূল্য দেয় তার মধ্যে ক্রিয়াকলাপ।

এই কোড এবং এর আউটপুট পার্থক্য ব্যাখ্যা করে:

#include<stdio.h>

int main(int argc, char* argv[])
{
  unsigned int i=0, a;
  a = i++;
  printf("i before: %d; value returned by i++: %d, i after: %d\n", i, a, i);
  i=0;
  a = ++i;
  printf("i before: %d; value returned by ++i: %d, i after: %d\n", i, a, i);
}

আউটপুট হল:

i before: 1; value returned by i++: 0, i after: 1
i before: 1; value returned by ++i: 1, i after: 1

সুতরাং মূলত ++iএটি বাড়ানোর পরে মানটি প্রদান করে, যখন বর্ধিত ++iহওয়ার আগে মানটি ফেরত দেয়। শেষে, উভয় ক্ষেত্রেই iএর মান বাড়বে।

আরেকটি উদাহরণ:

#include<stdio.h>

int main ()
  int i=0;
  int a = i++*2;
  printf("i=0, i++*2=%d\n", a);
  i=0;
  a = ++i * 2;
  printf("i=0, ++i*2=%d\n", a);
  i=0;
  a = (++i) * 2;
  printf("i=0, (++i)*2=%d\n", a);
  i=0;
  a = (++i) * 2;
  printf("i=0, (++i)*2=%d\n", a);
  return 0;
}

আউটপুট:

i=0, i++*2=0
i=0, ++i*2=2
i=0, (++i)*2=2
i=0, (++i)*2=2

অনেক সময় কোনও পার্থক্য হয় না

প্রত্যাশিত মানটি যখন অন্য পরিবর্তনশীলকে বরাদ্দ করা হয় বা যখন অন্যান্য ক্রিয়াকলাপের সাথে সংযোজনে যখন ক্রমবৃদ্ধি সম্পাদন করা হয় যেখানে অপারেশন অগ্রাধিকার প্রয়োগ করা হয় (এর i++*2চেয়ে আলাদা হয় ++i*2, (i++)*2এবং (++i)*2একই মানটি ফেরত দেয়) তখন পার্থক্যগুলি স্পষ্ট হয় যখন তারা বিনিময়যোগ্য হয়। লুপ সিনট্যাক্সের জন্য একটি শাস্ত্রীয় উদাহরণ হ'ল:

for(int i=0; i<10; i++)

এর একই প্রভাব রয়েছে

for(int i=0; i<10; ++i)

মনে রাখার নিয়ম

দুটি অপারেটরের মধ্যে কোনও বিভ্রান্তি না করার জন্য আমি এই নিয়মটি গ্রহণ করেছি:

অ্যাসাইনমেন্টের সাথে অপারেশনের ক্রমের সাথে ++চলকের সাথে সম্পর্কিত অপারেটরের অবস্থানকে যুক্ত করুনi++

অন্য কথায় বলেছেন:

  • ++ এর আগে অ্যাসাইনমেন্টের আগেi বর্ধিতকরণ অবশ্যই করা উচিত ;
  • ++ পরে i মানে incrementation সম্পন্ন করা আবশ্যক পর নিয়োগ:

3

আপনি এটির একাধিক বিবৃতি হিসাবে অভ্যন্তরীণ রূপান্তর সম্পর্কে ভাবতে পারেন ;

  • মামলা 1
i++;

আপনি এটি হিসাবে চিন্তা করতে পারেন,

i;
i = i+1;
  • কেস 2
++i;

আপনি এটি হিসাবে চিন্তা করতে পারেন,

i = i+i;
i;

-3

a = i ++ এর অর্থ একটিতে বর্তমান i মান a = ++ মানে একটি ইনক্রিমেন্টযুক্ত মান থাকে


10
এই উত্তরটি সঠিক নয়। a = i++;এর অর্থ হ'ল সঞ্চিত aমানটি iইনক্রিমেন্টের পূর্বে মান হবে তবে 'ইনক্রিমেন্টিং ছাড়াই' বোঝায় যে iবর্ধিত নয়, যা সম্পূর্ণ ভুল - iবর্ধিত হয়, তবে অভিব্যক্তির মান বর্ধনের আগে মূল্য।
জোনাথন লেফলার

-6

পার্থক্যটি বোঝার উদাহরণ এখানে

int i=10;
printf("%d %d",i++,++i);

আউটপুট: 10 12/11 11(ফাংশনটিতে আর্গুমেন্টের মূল্যায়নের ক্রমের উপর নির্ভর করে printf, যা সংকলক এবং আর্কিটেকচারে পৃথক হয়)

ব্যাখ্যা: i++-> iমুদ্রিত হয় এবং তারপরে বৃদ্ধি হয়। (প্রিন্ট 10, তবে i11 হবে) ++i-> iমান বৃদ্ধি এবং মান মুদ্রণ। (প্রিন্ট 12, এবং iএছাড়াও 12 এর মান )


11
i++++i
এমএম

@ লন্ডিন যে সঠিক, যদিও এলএইচএস, আরএইচএস অফ কমা তাদের মধ্যে ক্রম বিন্দু রয়েছে তবে 2 টি অভিব্যক্তি এখনও একে অপরের মধ্যে অসম্পূর্ণ রুদ্ধ
অ্যান্টি হাপালা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.