একটি লুপে প্রাক-বর্ধন এবং পোস্ট-ইনক্রিমেন্টের মধ্যে পার্থক্য?


303

একটি লুপ ++iএবং i++মধ্যে একটি পার্থক্য আছে for? এটি কি কেবল একটি বাক্য গঠন?



18
আমি কতটা উত্তর পুরোপুরি প্রশ্নের পয়েন্ট মিস করেছি তা দেখে আমি অবাক হয়েছি।
গ্রীম পেরো

3
সম্ভবত আমাদের অবাক করে দেওয়া উচিত যে প্রশ্নটি আরও পরিষ্কার হওয়ার জন্য কেউ সম্পাদনা করেনি :)
জন বি

2
এই প্রশ্নটি সি, জাভা, সি ++, পিএইচপি, সি #, জাভাস্ক্রিপ্ট, জেএসক্রিপ্ট, উদ্দেশ্য সি: এন.ইউইকিপিডিয়া.আর
ক্রিস এস

1
ভাল উত্তর এখানে পোস্ট করা হয়েছে: stackoverflow.com/a/4706225/214296
জিম ফেল

উত্তর:


233

a ++ পোস্টফিক্স হিসাবে পরিচিত।

1 এ 1 যুক্ত করুন, পুরানো মান প্রদান করে।

++ a উপসর্গ হিসাবে পরিচিত।

1 এ যোগ করুন, নতুন মান প্রদান করে।

সি #:

string[] items = {"a","b","c","d"};
int i = 0;
foreach (string item in items)
{
    Console.WriteLine(++i);
}
Console.WriteLine("");

i = 0;
foreach (string item in items)
{
    Console.WriteLine(i++);
}

আউটপুট:

1
2
3
4

0
1
2
3

foreachএবং whileলুপগুলি নির্ভর করে আপনি কোন বর্ধিত ধরণের ব্যবহার করেন তার উপর। নীচের মতো লুপগুলির সাথে এটি কোনও পার্থক্য করে না কারণ আপনি i এর ফেরতের মানটি ব্যবহার করছেন না:

for (int i = 0; i < 5; i++) { Console.Write(i);}
Console.WriteLine("");
for (int i = 0; i < 5; ++i) { Console.Write(i); }

0 1 2 3 4
0 1 2 3 4

যদি মূল্যায়ন হিসাবে মান ব্যবহার করা হয় তবে বর্ধনের ধরণটি উল্লেখযোগ্য হয়ে ওঠে:

int n = 0;
for (int i = 0; n < 5; n = i++) { }

4
এটি ব্যবহারকারী যা চেয়েছিলেন তাও নয়।
দিমিত্রি

223

প্রাক-বৃদ্ধি ++ i i এর মান বৃদ্ধি করে এবং নতুন বর্ধিত মানকে মূল্যায়ণ করে।

int i = 3;
int preIncrementResult = ++i;
Assert( preIncrementResult == 4 );
Assert( i == 4 );

পোস্ট-ইনক্রিমেন্ট i ++ i এর মান বৃদ্ধি করে এবং মূল অ-বর্ধিত মানকে মূল্যায়ন করে।

int i = 3;
int postIncrementResult = i++;
Assert( postIncrementtResult == 3 );
Assert( i == 4 );

সি ++ এ, প্রাক-বৃদ্ধিটি সাধারণত পছন্দ করা হয় যেখানে আপনি যে কোনওটি ব্যবহার করতে পারেন।

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

সুতরাং, কমপক্ষে সি ++ এ, পারফরম্যান্সের পার্থক্য থাকতে পারে যা আপনার পছন্দগুলির কোনটি ব্যবহার করবেন তা গাইড করে।

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

এখানে আরও কিছু আলোচনা রয়েছে:
https://web.archive.org/web/20170405054235/http://en.allexperts.com/q/C-1040/Increment-operators.htm

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


অন্যান্য ভাষায় যেমন সি # যেখানে ++ অপারেটর ওভারলোড করা যায় না সেখানে কার্য সম্পাদনের পার্থক্য নেই। লুপ ভেরিয়েবলটি অগ্রসর করতে একটি লুপে ব্যবহৃত হয়, প্রাক এবং পোস্ট ইনক্রিমেন্ট অপারেটর সমতুল্য।

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


102
সি ++ এর নামকরণ ++ সি করা থাকলে এটি দুর্দান্ত হত না যদি আপনি এটি ব্যবহার করে একটি ভাল অপ্টিমাইজড কোড লিখতে পারেন ..
নবীন

9
আধুনিক সংকলকগণ যখন ফলস্বরূপ মানটি অবশ্যই স্পষ্টভাবে ট্র্যাশ হতে চলেছে তখন এটিকে অনুকূল করতে সক্ষম হওয়া উচিত নয়?
শে

6
@ চে - তারা যখন এটি সাধারণ ধরণের হয় তখন ক্লাসগুলি ওভারলোড অপারেটর ++ (যেমন পুনরাবৃত্তিকারী) আলাদা গল্প।
ফেরুক্সিও

7
@ চে: এটি একটি ভাল প্রশ্ন। যে কারণে সি ++ সংকলকগুলি "কাস্টমটাইপ ++" প্রতিস্থাপন করে না; "++ কাস্টমটাইপ;" সহ কারণ এর কোনও গ্যারান্টি নেই যে ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির উভয়ই একই রকম প্রভাব ফেলে। তারা উচিত ... তবে এর কোনও গ্যারান্টি নেই।
ড্রয় ডোরম্যান

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

83

সি # তে লুপের জন্য ব্যবহার করার সময় কোনও পার্থক্য নেই ।

for (int i = 0; i < 10; i++) { Console.WriteLine(i); }

একই জিনিস আউটপুট

for (int i = 0; i < 10; ++i) { Console.WriteLine(i); }

অন্যরা যেমন উল্লেখ করেছে, যখন সাধারণ i ++ এবং ++ ব্যবহার করা হয় তখন আমার একটি সূক্ষ্ম তবু উল্লেখযোগ্য পার্থক্য থাকে:

int i = 0;
Console.WriteLine(i++);   // Prints 0
int j = 0;
Console.WriteLine(++j);   // Prints 1

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

++ i এর মান বাড়িয়ে দেয় তবে তা পড়ে।


সমাপ্তি: সি ++ তে একই পোস্ট / প্রাক বর্ধিত শব্দার্থবিদ্যা।
xtofl

@xtofl - আপনার পয়েন্টটি কী তা নিশ্চিত নন? আমার উদাহরণের জন্য আমি কেবল সি # বেছে নেওয়ার চেষ্টা করেছি।
জন বি

3
আমি মনে করি না যে প্রথম পয়েন্টটি প্রাসঙ্গিক। লুপের জন্য (সি # বা না) ইনক্রিমেন্ট অংশটি সর্বদা লুপের বডি পরে কার্যকর করা হয়। একবার মৃত্যুদন্ড কার্যকর হলে, ভেরিয়েবলটি পোস্ট বা প্রাক ইনক্রিমেন্ট ব্যবহার করা হয়েছিল কিনা তা সংশোধন করা হয়।
ম্যাথিউইউপি

9
@ ম্যাথিউইউপি - আমি প্রশ্নটি পড়লাম "আপনি লুপের জন্য i ++ বা ++ i ব্যবহার করেন কিনা তা বিবেচ্য নয়" read উত্তরটি "না এটি হয় না"।
জন বি

1
@ জোনবি উত্তরের ক্রমগুলির ক্রমটি ঠিক সঠিক নয়। উভয় ++iএবং i++একই ক্রিয়ায় একই ক্রিয়াকলাপ সম্পাদন করুন: এর টেম্প কপি তৈরি করুন i; একটি নতুন মান উত্পাদন করার জন্য অস্থায়ী মান বৃদ্ধি করুন (টেম্পর ওভাররাইড না করে); নতুন মান সংরক্ষণ করুন i; এখন যদি ++iফলাফলটি ফিরে আসে তবে নতুন মান হয়; যদি i++ফলাফলটি ফিরে আসে তা হ'ল অস্থায়ী অনুলিপি। : আরো এখানে উত্তর বিস্তারিত stackoverflow.com/a/3346729/3330348
PiotrWolkowski

51

প্রশ্ন হচ্ছে:

লুপের জন্য কি ++ i এবং i++ এর মধ্যে পার্থক্য রয়েছে?

উত্তর: না

এমনকি যখন এগুলি জিজ্ঞাসা করা হয় না তখন কেন প্রতিটি এবং প্রতিটি উত্তর উত্তর এবং উত্তর বৃদ্ধি সম্পর্কে বিশদ বিবরণে যেতে হয়?

এই লুপ জন্য:

for (int i = 0; // Initialization
     i < 5;     // Condition
     i++)       // Increment
{
   Output(i);
}

লুপগুলি ব্যবহার না করে এই কোডটিতে অনুবাদ করতে হবে:

int i = 0; // Initialization

loopStart:
if (i < 5) // Condition
{
   Output(i);

   i++ or ++i; // Increment

   goto loopStart;
}

এখন আপনি এখানে i++বা ++iইনক্রিমেন্ট হিসাবে রাখেন তা কি ব্যাপার ? না এটি যেমন ইনক্রিমেন্ট অপারেশনের রিটার্ন মান তুচ্ছ হয় না। iলুপের বডিটির ভিতরে থাকা কোডটির সম্পাদনের পরে বাড়ানো হবে।


2
এটি আক্ষরিক অর্থে প্রথম উত্তর যা ডানে চলে যায়। ধন্যবাদ।
ইয়াসির

1
এটি সর্বোত্তম উত্তর নয় কারণ লুপের জন্য যদি কোনও জটিল অবজেক্টটি বাড়ানো হয় ( ইনট ছাড়া অন্য কিছু!) ++ এক্স এর প্রয়োগটি এক্স ++ এর চেয়ে দ্রুত হতে পারে ... (দেখুন herbsutter.com/2013/05/13/gotw -2-সমাধান-অস্থায়ী-অবজেক্টস )
জিসিএক্স 4'19

30

যেহেতু আপনি একটি লুপের মধ্যে পার্থক্য সম্পর্কে জিজ্ঞাসা করছেন, আমার ধারণা আপনার অর্থ কি mean

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

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

আপনি যেটির মানটি ব্যবহার করেন না সে কারণে এটি উপরে কেন গুরুত্ব দেয় না i++। আর একটি জিনিস আপনি যখন করেন

for(int i=0, a = 0; i<10; a = i++) 
    ...;

এখন, হয় একটি পার্থক্য, কারণ হিসাবে অন্যদের বাতলান i++উপায়ে বাড়ায়, কিন্তু পূর্ববর্তী মান নির্ণয় করা , কিন্তু ++iমানে বৃদ্ধি, কিন্তু মূল্যায়নi (সুতরাং এটা নতুন মান মূল্যায়ন করবেন)। উপরের ক্ষেত্রে, ai এর পূর্ববর্তী মান নির্ধারিত হয়, যখন আমি বর্ধিত হয়।


3
সি ++ তে, কম্পাইলারের পক্ষে অস্থায়ী করা এড়ানো সর্বদা সম্ভব নয়, তাই প্রাক-বর্ধিত ফর্মটি পছন্দ করা হয়।
ডেভিড থর্নলি

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

15

এই কোডটি দেখায় (মন্তব্যগুলিতে বিভক্ত এমএসআইএল দেখুন), সি # 3 সংকলক লুপের জন্য i ++ এবং ++ i এর মধ্যে কোনও পার্থক্য রাখে না। যদি i ++ বা ++ i এর মান নেওয়া হয় তবে অবশ্যই একটি পার্থক্য হবে (এটি ভিসুয়াল স্টুডিও ২০০৮ / রিলিজ বিল্ডে সংকলিত হয়েছিল):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PreOrPostIncrement
{
    class Program
    {
        static int SomethingToIncrement;

        static void Main(string[] args)
        {
            PreIncrement(1000);
            PostIncrement(1000);
            Console.WriteLine("SomethingToIncrement={0}", SomethingToIncrement);
        }

        static void PreIncrement(int count)
        {
            /*
            .method private hidebysig static void  PreIncrement(int32 count) cil managed
            {
              // Code size       25 (0x19)
              .maxstack  2
              .locals init ([0] int32 i)
              IL_0000:  ldc.i4.0
              IL_0001:  stloc.0
              IL_0002:  br.s       IL_0014
              IL_0004:  ldsfld     int32 PreOrPostIncrement.Program::SomethingToIncrement
              IL_0009:  ldc.i4.1
              IL_000a:  add
              IL_000b:  stsfld     int32 PreOrPostIncrement.Program::SomethingToIncrement
              IL_0010:  ldloc.0
              IL_0011:  ldc.i4.1
              IL_0012:  add
              IL_0013:  stloc.0
              IL_0014:  ldloc.0
              IL_0015:  ldarg.0
              IL_0016:  blt.s      IL_0004
              IL_0018:  ret
            } // end of method Program::PreIncrement             
             */
            for (int i = 0; i < count; ++i)
            {
                ++SomethingToIncrement;
            }
        }

        static void PostIncrement(int count)
        {
            /*
                .method private hidebysig static void  PostIncrement(int32 count) cil managed
                {
                  // Code size       25 (0x19)
                  .maxstack  2
                  .locals init ([0] int32 i)
                  IL_0000:  ldc.i4.0
                  IL_0001:  stloc.0
                  IL_0002:  br.s       IL_0014
                  IL_0004:  ldsfld     int32 PreOrPostIncrement.Program::SomethingToIncrement
                  IL_0009:  ldc.i4.1
                  IL_000a:  add
                  IL_000b:  stsfld     int32 PreOrPostIncrement.Program::SomethingToIncrement
                  IL_0010:  ldloc.0
                  IL_0011:  ldc.i4.1
                  IL_0012:  add
                  IL_0013:  stloc.0
                  IL_0014:  ldloc.0
                  IL_0015:  ldarg.0
                  IL_0016:  blt.s      IL_0004
                  IL_0018:  ret
                } // end of method Program::PostIncrement
             */
            for (int i = 0; i < count; i++)
            {
                SomethingToIncrement++;
            }
        }
    }
}

14

একটি (++ i) হ'ল প্রিনক্রেনমেন্ট, একটি (আই ++) পোস্ট-ইনক্রিমেন্ট। পার্থক্যটি হ'ল মূল্যটি সঙ্গে সঙ্গে প্রকাশ থেকে ফিরে আসে।

// Psuedocode
int i = 0;
print i++; // Prints 0
print i; // Prints 1
int j = 0;
print ++j; // Prints 1
print j; // Prints 1

সম্পাদনা করুন: ওফস, জিনিসগুলির লুপের দিকটি সম্পূর্ণ উপেক্ষা করুন। লুপের ক্ষেত্রে 'ধাপ' অংশটি ((...; ...;)) এর মধ্যে কোনও আসল পার্থক্য নেই, তবে এটি অন্যান্য ক্ষেত্রে কার্যকর হতে পারে।


7

লুপে ইনক্রিমেন্টের পরে যদি মানটি ব্যবহার না করে তবে কোনও পার্থক্য নেই।

for (int i = 0; i < 4; ++i){
cout<<i;       
}
for (int i = 0; i < 4; i++){
cout<<i;       
}

উভয় লুপ 0123 মুদ্রণ করবে।

তবে পার্থক্যটি তখন আসে যখন আপনি নীচের মতো আপনার লুপে বর্ধিত / হ্রাসের পরে মানটি ব্যবহার করেন:

প্রাক বৃদ্ধির লুপ:

for (int i = 0,k=0; i < 4; k=++i){
cout<<i<<" ";       
cout<<k<<" "; 
}

আউটপুট: 0 0 1 1 2 2 3 3

পোস্ট বৃদ্ধির লুপ:

for (int i = 0, k=0; i < 4; k=i++){
cout<<i<<" ";       
cout<<k<<" "; 
}

আউটপুট: 0 0 1 0 2 1 3 2

আমি আশা করি আউটপুট তুলনা করে পার্থক্যটি পরিষ্কার হবে। এখানে লক্ষ্য করুন পয়েন্টটি হ'ল ইনক্রিমেন্ট / হ্রাস সর্বদা লুপের শেষে করা হয় এবং ফলস্বরূপ ফলাফল ব্যাখ্যা করা যায়।


7

এখানে একটি জাভা-নমুনা এবং বাইট-কোড, পোস্ট- এবং প্রাক-সংযোজন বাইটেকোডে কোনও পার্থক্য দেখায় না:

public class PreOrPostIncrement {

    static int somethingToIncrement = 0;

    public static void main(String[] args) {
        final int rounds = 1000;
        postIncrement(rounds);
        preIncrement(rounds);
    }

    private static void postIncrement(final int rounds) {
        for (int i = 0; i < rounds; i++) {
            somethingToIncrement++;
        }
    }

    private static void preIncrement(final int rounds) {
        for (int i = 0; i < rounds; ++i) {
            ++somethingToIncrement;
        }
    }
}

এবং এখন বাইট কোডের জন্য

public class PreOrPostIncrement extends java.lang.Object{
static int somethingToIncrement;

static {};
Code:
0:  iconst_0
1:  putstatic   #10; //Field somethingToIncrement:I
4:  return

public PreOrPostIncrement();
Code:
0:  aload_0
1:  invokespecial   #15; //Method java/lang/Object."<init>":()V
4:  return

public static void main(java.lang.String[]);
Code:
0:  sipush  1000
3:  istore_1
4:  sipush  1000
7:  invokestatic    #21; //Method postIncrement:(I)V
10: sipush  1000
13: invokestatic    #25; //Method preIncrement:(I)V
16: return

private static void postIncrement(int);
Code:
0:  iconst_0
1:  istore_1
2:  goto    16
5:  getstatic   #10; //Field somethingToIncrement:I
8:  iconst_1
9:  iadd
10: putstatic   #10; //Field somethingToIncrement:I
13: iinc    1, 1
16: iload_1
17: iload_0
18: if_icmplt   5
21: return

private static void preIncrement(int);
Code:
0:  iconst_0
1:  istore_1
2:  goto    16
5:  getstatic   #10; //Field somethingToIncrement:I
8:  iconst_1
9:  iadd
10: putstatic   #10; //Field somethingToIncrement:I
13: iinc    1, 1
16: iload_1
17: iload_0
18: if_icmplt   5
21: return

}

5

হ্যা এখানে. পার্থক্যটি ফেরতের মানের মধ্যে। "++ i" এর রিটার্ন মান i বৃদ্ধি করার পরে মান হবে । "I ++" এর রিটার্ন ইনক্রিমেন্টের আগে মান হবে । এর অর্থ এই কোডটি যা নিম্নলিখিতগুলির মতো দেখায়:

int a = 0;
int b = ++a; // a is incremented and the result after incrementing is saved to b.
int c = a++; // a is incremented again and the result before incremening is saved to c.

অতএব, ক হবে 2, এবং খ এবং সি প্রতিটি 1 হবে।

আমি কোডটি আবার লিখতে পারি:

int a = 0; 

// ++a;
a = a + 1; // incrementing first.
b = a; // setting second. 

// a++;
c = a; // setting first. 
a = a + 1; // incrementing second. 

4

উভয় ক্ষেত্রেই কোনও পার্থক্য নেই ' i' দ্বারা 1 বাড়ানো হবে।

আপনি যখন এটি একটি অভিব্যক্তিতে ব্যবহার করেন তবে একটি পার্থক্য রয়েছে, উদাহরণস্বরূপ:

int i = 1;
int a = ++i;
// i is incremented by one and then assigned to a.
// Both i and a are now 2.
int b = i++;
// i is assigned to b and then incremented by one.
// b is now 2, and i is now 3

3

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

1- It is illegal to take the address of post increment result. Compiler won't even allow you.
2- Only constant references to post increment can exist, i.e., of the form const T&.
3- You cannot apply another post increment or decrement to the result of i++, i.e., there is no such thing as I++++. This would be parsed as ( i ++ ) ++ which is illegal.
4- When overloading pre-/post-increment and decrement operators, programmers are encouraged to define post- increment/decrement operators like:

T& operator ++ ( )
{
   // logical increment
   return *this;
}

const T operator ++ ( int )
{
    T temp( *this );
    ++*this;
    return temp;
}

3

এটি আমার মনকে ছাপিয়ে যায় যে কেন লোকেরা আই ++ হিসাবে লুপে বর্ধিত অভিব্যক্তি লিখতে পারে।

একটি লুপ-এ, যখন তৃতীয় উপাদানটি সরল বর্ধিত বিবৃতি হয় in

for (i=0; i<x; i++)  

অথবা

for (i=0; i<x; ++i)   

ফলস্বরূপ মৃত্যুদণ্ড কার্যকর করার ক্ষেত্রে কোনও পার্থক্য নেই।


এটি একটি উত্তর, বা এটি একটি প্রশ্ন?
প্লেলে

2
যেহেতু এটি কোনও বিষয় নয়, কেন কেউ আপনার ++ লিখেছিল তা আপনার মনে কেন বিচলিত হবে? কেউ ++ i লিখতে পছন্দ করবেন এমন কোনও কারণ আছে কি?
দ্রোঞ্জ

2

@ জোন বি যেমন বলেছেন, লুপের জন্য কোনও পার্থক্য নেই।

তবে একটি whileবা do...whileলুপে আপনি ++iবা এর সাথে তুলনা করাতে পারলে কিছু পার্থক্য খুঁজে পেতে পারেনi++

while(i++ < 10) { ... } //compare then increment

while(++i < 10) { ... } //increment then compare

দুই ডাউনভোটস? আমি যা লিখেছি তাতে কী ভুল? এবং এটি প্রশ্নের সাথে সম্পর্কিত (যতটা অস্পষ্ট তাই)।
ক্র্যাশস্ট্রিস্ট

2

জাভাস্ক্রিপ্টে নিম্নলিখিত আই ++ এর কারণে ব্যবহার করা আরও ভাল হতে পারে:

var i=1;
alert(i++); // before, 1. current, 1. after, 2.
alert(i); // before, 2. current, 2. after, 2.
alert(++i); // before, 2. current, 3 after, 3.

অ্যারেগুলিতে (আমি সমস্ত মনে করি) এবং অন্যান্য কিছু ফাংশন এবং কলগুলি 0 টি প্রারম্ভিক পয়েন্ট হিসাবে ব্যবহার করে আপনি ++ i ব্যবহার করার সময় অ্যারের সাথে লুপটি কাজ করতে আপনাকে আই -1 সেট করতে হবে ।

আই ++ ব্যবহার করার সময় নিম্নলিখিত মানটি বর্ধিত মানটি ব্যবহার করবে। আপনি বলতে পারেন যে আই ++ হ'ল মানুষের গণনা, কারণ আপনি 0 দিয়ে শুরু করতে পারেন ।


2

একটি ফর লুপ কী করে তা বুঝতে

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

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

for (i = 0; i < 5; ++i) {
  DoSomethingA();
  DoSomethingB();
}

WHILE সংস্করণের সমান

i = 0; //first argument (a statement) of for
while (i < 5 /*second argument (a condition) of for*/) {
  DoSomethingA();
  DoSomethingB();
  ++i; //third argument (another statement) of for
}

এর মানে আপনি ব্যবহার করতে পারেন জন্য একটি সরল সংস্করণ হিসেবে যখন :

  1. ফর ( প্রথম আই) এর প্রথম যুক্তিটি লুপের আগে, বাইরে, কার্যকর করা হয়।

  2. ফর (i ++ বা ++ i) এর তৃতীয় যুক্তিটি লুপের শেষ লাইনে , ভিতরে, সম্পাদিত হয় ।

টি এল: ডিআর: কোন ব্যাপার কিনা i++বা++i , আমরা জানি যে, যখন তারা স্বতন্ত্র, তারা নিজেদের উপর কোন পার্থক্য কিন্তু +1 টি আছে।

স্কুলে, তারা সাধারণত i ++ উপায় শেখায়, তবে বিভিন্ন কারণে অনেক লোক ++ i উপায় পছন্দ করে ।

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


1

লুপগুলির জন্য একটি পার্থক্য থাকতে পারে। এটি পোস্ট / প্রাক-বর্ধনের ব্যবহারিক প্রয়োগ।

        int i = 0;
        while(i++ <= 10) {
            Console.Write(i);
        }
        Console.Write(System.Environment.NewLine);

        i = 0;
        while(++i <= 10) {
            Console.Write(i);
        }
        Console.ReadLine();

যদিও প্রথমটি 11 টি গণনা করে এবং 11 বার লুপ করে, দ্বিতীয়টি তা করে না।

বেশিরভাগ ক্ষেত্রে এটি বরং সরল সময় ব্যবহার করা হয় (x--> 0); - - পুনরাবৃত্তি করার জন্য লুপ উদাহরণস্বরূপ একটি অ্যারের সমস্ত উপাদান (এখানে পূর্বাভাস-নির্মাণকে ছাড় দেওয়া)।


1

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

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

int i = 3;
int a = i++; // a = 3, i = 4
int b = ++a; // b = 4, a = 

এই লিঙ্কটি পরীক্ষা করুন


0

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

iএকটি কোড হিসাবে অভিব্যক্তি মূল্যায়ন মানে iএবং অপারেটর একটি মূল্যায়ন বোঝায় না শুধুমাত্র একটি অপারেশন;

  • ++iমানে i1 এর বর্ধিত মান এবং পরে মূল্যায়ন i,
  • i++মানে 1 দ্বারা মূল্যায়ন করা iএবং পরে ইনক্রিমেন্ট মান i

সুতরাং, প্রতিটি দুটি এক্সপ্রেশন থেকে যা প্রাপ্ত হয় তা পৃথক হয় কারণ যা মূল্যায়ন করা হয় সেগুলির মধ্যে পৃথক। সব একই জন্য --iএবংi--

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

let i = 0

i++ // evaluates to value of i, means evaluates to 0, later increments i by 1, i is now 1
0
i
1
++i // increments i by 1, i is now 2, later evaluates to value of i, means evaluates to 2
2
i
2

অস্বাভাবিক ব্যবহারের ক্ষেত্রে, তবে পরবর্তী উদাহরণগুলি দরকারী মনে হয় বা কিছু যায় আসে না, এটি একটি পার্থক্য দেখায়

for(i=0, j=i; i<10; j=++i){
    console.log(j, i)
}

for(i=0, j=i; i<10; j=i++){
    console.log(j, i)
}

এটি বিদ্যমান উত্তরের সাথে কী যুক্ত করে?
GManNickG

আমি যে উত্তরগুলি পড়েছি তার চেয়ে এটি যা সরাসরি জিজ্ঞাসিত হয় তার উত্তর দেয়।
সেল্পুক

-2

জন্য i'ব্যবহারকারী-সংজ্ঞায়িত ধরনের গুলি, এই অপারেটার পারা (কিন্তু উচিত না ) একটি লুপ সূচক প্রেক্ষাপটে অর্থপূর্ণ বিভিন্ন sematics আছে, এবং এই (কিন্তু উচিত নয়) ওপর প্রভাব ফেলতে পারে লুপ আচরণকে বর্ণনা করেছেন।

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


পোস্টফিক্সের শব্দার্থবিজ্ঞানের উপসর্গের চেয়ে বড় হওয়ার কথা । -1
xtofl

-2

আমি অন্য ভাষার জন্য জানি না তবে জাভাতে ++ আমি হ'ল একটি প্রিফিক্স ইনক্রিমেন্ট যার অর্থ: আমি 1 দ্বারা বাড়ান এবং তারপরে আমি যে অভিব্যক্তিতে থাকি তাতে i এর নতুন মানটি ব্যবহার করি এবং i++ একটি পোস্টফিক্স ইনক্রিমেন্ট যার অর্থ নিম্নলিখিতগুলি বোঝায় : এক্সপ্রেশনটিতে i এর বর্তমান মানটি ব্যবহার করুন এবং তারপরে এটি 1 দিয়ে বাড়ান Example উদাহরণ:

public static void main(String [] args){

    int a = 3;
    int b = 5;
    System.out.println(++a);
    System.out.println(b++);
    System.out.println(b);

} এবং আউটপুটটি হ'ল:

  • 4
  • 5
  • 6

-3

আমি ++; ++ আমি; উভয়ই একই রকম কারণ এগুলি একটি অভিব্যক্তিতে ব্যবহৃত হয় না।

class A {

     public static void main (String []args) {

     int j = 0 ;
     int k = 0 ;
     ++j;
     k++;
    System.out.println(k+" "+j);

}}

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