একটি লুপ ++i
এবং i++
মধ্যে একটি পার্থক্য আছে for
? এটি কি কেবল একটি বাক্য গঠন?
একটি লুপ ++i
এবং i++
মধ্যে একটি পার্থক্য আছে for
? এটি কি কেবল একটি বাক্য গঠন?
উত্তর:
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++) { }
প্রাক-বৃদ্ধি ++ 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
সি ++ এ আপনি যদি এসটিএল ব্যবহার করেন তবে আপনি পুনরাবৃত্তকারীগুলির সাথে লুপের জন্য ব্যবহার করতে পারেন। এগুলিতে মূলত ++ অপারেটরদের ওভাররাইড করা হয়েছে, তাই প্রাক-বর্ধনের সাথে লেগে থাকা ভাল ধারণা। সংযোজকরা যদিও সার্বক্ষণিক স্মার্ট হয়ে যায় এবং নতুনরা অপ্টিমাইজেশন করতে সক্ষম হতে পারে যার অর্থ পারফরম্যান্সের কোনও পার্থক্য নেই - বিশেষত যদি প্রকারের বর্ধনশীল শিরোনাম ফাইলে ইনলাইন সংজ্ঞায়িত করা হয় (এসটিএল বাস্তবায়নগুলি প্রায়শই থাকে) যাতে সংকলকটি দেখতে পারে যে পদ্ধতিটি প্রয়োগ করা হয়েছে এবং তারপরে কী অপ্টিমাইজেশানগুলি সম্পাদন করা নিরাপদ তা জানতে পারবেন। তবুও, সম্ভবত এটি প্রাক-বর্ধনের সাথে আঁকিয়ে রাখা মূল্যবান কারণ লুপগুলি অনেক সময় কার্যকর হয় এবং এর অর্থ একটি ছোট পারফরম্যান্স পেনাল্টি শীঘ্রই প্রশস্ত করা যেতে পারে।
অন্যান্য ভাষায় যেমন সি # যেখানে ++ অপারেটর ওভারলোড করা যায় না সেখানে কার্য সম্পাদনের পার্থক্য নেই। লুপ ভেরিয়েবলটি অগ্রসর করতে একটি লুপে ব্যবহৃত হয়, প্রাক এবং পোস্ট ইনক্রিমেন্ট অপারেটর সমতুল্য।
সংশোধন: ওভারলোডিং ++ সি # তে অনুমোদিত। যদিও এটি মনে হয়, সি ++ এর তুলনায় সি # তে আপনি স্বাধীনভাবে প্রাক এবং পোস্ট সংস্করণগুলি ওভারলোড করতে পারবেন না। সুতরাং, আমি ধরে নেব যে যদি সি # তে ++ কল করার ফলাফলটি যদি কোনও ভেরিয়েবলের জন্য বরাদ্দ না করা হয় বা কোনও জটিল ভাবের অংশ হিসাবে ব্যবহার না করা হয় তবে সংকলকটি ++ এর পূর্ব ও পোস্ট সংস্করণগুলিকে সমান পারফরম্যান্স সম্পাদন করবে।
সি # তে লুপের জন্য ব্যবহার করার সময় কোনও পার্থক্য নেই ।
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 এর মান বাড়িয়ে দেয় তবে তা পড়ে।
++i
এবং i++
একই ক্রিয়ায় একই ক্রিয়াকলাপ সম্পাদন করুন: এর টেম্প কপি তৈরি করুন i
; একটি নতুন মান উত্পাদন করার জন্য অস্থায়ী মান বৃদ্ধি করুন (টেম্পর ওভাররাইড না করে); নতুন মান সংরক্ষণ করুন i
; এখন যদি ++i
ফলাফলটি ফিরে আসে তবে নতুন মান হয়; যদি i++
ফলাফলটি ফিরে আসে তা হ'ল অস্থায়ী অনুলিপি। : আরো এখানে উত্তর বিস্তারিত stackoverflow.com/a/3346729/3330348
প্রশ্ন হচ্ছে:
লুপের জন্য কি ++ 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
লুপের বডিটির ভিতরে থাকা কোডটির সম্পাদনের পরে বাড়ানো হবে।
যেহেতু আপনি একটি লুপের মধ্যে পার্থক্য সম্পর্কে জিজ্ঞাসা করছেন, আমার ধারণা আপনার অর্থ কি 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
(সুতরাং এটা নতুন মান মূল্যায়ন করবেন)। উপরের ক্ষেত্রে, a
i এর পূর্ববর্তী মান নির্ধারিত হয়, যখন আমি বর্ধিত হয়।
এই কোডটি দেখায় (মন্তব্যগুলিতে বিভক্ত এমএসআইএল দেখুন), সি # 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++;
}
}
}
}
একটি (++ i) হ'ল প্রিনক্রেনমেন্ট, একটি (আই ++) পোস্ট-ইনক্রিমেন্ট। পার্থক্যটি হ'ল মূল্যটি সঙ্গে সঙ্গে প্রকাশ থেকে ফিরে আসে।
// Psuedocode
int i = 0;
print i++; // Prints 0
print i; // Prints 1
int j = 0;
print ++j; // Prints 1
print j; // Prints 1
সম্পাদনা করুন: ওফস, জিনিসগুলির লুপের দিকটি সম্পূর্ণ উপেক্ষা করুন। লুপের ক্ষেত্রে 'ধাপ' অংশটি ((...; ...;)) এর মধ্যে কোনও আসল পার্থক্য নেই, তবে এটি অন্যান্য ক্ষেত্রে কার্যকর হতে পারে।
লুপে ইনক্রিমেন্টের পরে যদি মানটি ব্যবহার না করে তবে কোনও পার্থক্য নেই।
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
আমি আশা করি আউটপুট তুলনা করে পার্থক্যটি পরিষ্কার হবে। এখানে লক্ষ্য করুন পয়েন্টটি হ'ল ইনক্রিমেন্ট / হ্রাস সর্বদা লুপের শেষে করা হয় এবং ফলস্বরূপ ফলাফল ব্যাখ্যা করা যায়।
এখানে একটি জাভা-নমুনা এবং বাইট-কোড, পোস্ট- এবং প্রাক-সংযোজন বাইটেকোডে কোনও পার্থক্য দেখায় না:
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
}
হ্যা এখানে. পার্থক্যটি ফেরতের মানের মধ্যে। "++ 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.
উভয় ক্ষেত্রেই কোনও পার্থক্য নেই ' 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
লুপ এবং পারফরম্যান্স পার্থক্যগুলির চেয়ে আরও অনেক বেশি ++ 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;
}
এটি আমার মনকে ছাপিয়ে যায় যে কেন লোকেরা আই ++ হিসাবে লুপে বর্ধিত অভিব্যক্তি লিখতে পারে।
একটি লুপ-এ, যখন তৃতীয় উপাদানটি সরল বর্ধিত বিবৃতি হয় in
for (i=0; i<x; i++)
অথবা
for (i=0; i<x; ++i)
ফলস্বরূপ মৃত্যুদণ্ড কার্যকর করার ক্ষেত্রে কোনও পার্থক্য নেই।
@ জোন বি যেমন বলেছেন, লুপের জন্য কোনও পার্থক্য নেই।
তবে একটি while
বা do...while
লুপে আপনি ++i
বা এর সাথে তুলনা করাতে পারলে কিছু পার্থক্য খুঁজে পেতে পারেনi++
while(i++ < 10) { ... } //compare then increment
while(++i < 10) { ... } //increment then compare
জাভাস্ক্রিপ্টে নিম্নলিখিত আই ++ এর কারণে ব্যবহার করা আরও ভাল হতে পারে:
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 দিয়ে শুরু করতে পারেন ।
একটি ফর লুপ কী করে তা বুঝতে
উপরের চিত্রটি দেখায় যে ফর হ'ল রূপান্তরিত হতে পারে , কারণ তাদের শেষ পর্যন্ত একই সমাবেশ কোড (কমপক্ষে জিসিসিতে) থাকে। সুতরাং আমরা ভেঙ্গে দিতে পারে জন্য টুকরা একটি দম্পতি মধ্যে, সহজে বোধগম্য এটা কি করে।
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
}
এর মানে আপনি ব্যবহার করতে পারেন জন্য একটি সরল সংস্করণ হিসেবে যখন :
ফর ( প্রথম আই) এর প্রথম যুক্তিটি লুপের আগে, বাইরে, কার্যকর করা হয়।
ফর (i ++ বা ++ i) এর তৃতীয় যুক্তিটি লুপের শেষ লাইনে , ভিতরে, সম্পাদিত হয় ।
টি এল: ডিআর: কোন ব্যাপার কিনা
i++
বা++i
, আমরা জানি যে, যখন তারা স্বতন্ত্র, তারা নিজেদের উপর কোন পার্থক্য কিন্তু +1 টি আছে।স্কুলে, তারা সাধারণত i ++ উপায় শেখায়, তবে বিভিন্ন কারণে অনেক লোক ++ i উপায় পছন্দ করে ।
দ্রষ্টব্য: অতীতে, i ++ এর পারফরম্যান্সের উপর খুব কম প্রভাব পড়ে, কারণ এটি কেবল নিজের সাথে একত্র করে না, তবে মূল মানটিকে রেজিস্টারে রাখে। তবে আপাতত, এটি কোনও পার্থক্য করে না কারণ সংকলকটি প্লাস ওয়ান অংশটিকে একই করে।
লুপগুলির জন্য একটি পার্থক্য থাকতে পারে। এটি পোস্ট / প্রাক-বর্ধনের ব্যবহারিক প্রয়োগ।
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); - - পুনরাবৃত্তি করার জন্য লুপ উদাহরণস্বরূপ একটি অ্যারের সমস্ত উপাদান (এখানে পূর্বাভাস-নির্মাণকে ছাড় দেওয়া)।
তারা উভয়ই সংখ্যা বৃদ্ধি করে। ++i
সমতূল্য i = i + 1
।
i++
এবং ++i
খুব মিল কিন্তু ঠিক একই নয়। উভয়ই সংখ্যা বৃদ্ধি করে, তবে ++i
বর্তমান প্রকাশের আগে মূল্যায়ন করার আগে সংখ্যাটি বৃদ্ধি করে, যেখানে i++
অভিব্যক্তিটি মূল্যায়নের পরে সংখ্যা বৃদ্ধি করে।
int i = 3;
int a = i++; // a = 3, i = 4
int b = ++a; // b = 4, a =
এই লিঙ্কটি পরীক্ষা করুন ।
হ্যাঁ, এর মধ্যে ++i
এবং i++
একটি for
লুপের মধ্যে পার্থক্য রয়েছে , যদিও অস্বাভাবিক ব্যবহারের ক্ষেত্রে; যখন ইনক্রিমেন্ট / হ্রাস অপারেটর সহ একটি লুপ ভেরিয়েবল ব্লকের জন্য বা লুপ পরীক্ষা এক্সপ্রেশনের মধ্যে বা লুপ ভেরিয়েবলগুলির মধ্যে একটির সাথে ব্যবহৃত হয় । না এটি কেবল একটি সিনট্যাক্স জিনিস নয়।
i
একটি কোড হিসাবে অভিব্যক্তি মূল্যায়ন মানে i
এবং অপারেটর একটি মূল্যায়ন বোঝায় না শুধুমাত্র একটি অপারেশন;
++i
মানে i
1 এর বর্ধিত মান এবং পরে মূল্যায়ন 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)
}
জন্য i
'ব্যবহারকারী-সংজ্ঞায়িত ধরনের গুলি, এই অপারেটার পারা (কিন্তু উচিত না ) একটি লুপ সূচক প্রেক্ষাপটে অর্থপূর্ণ বিভিন্ন sematics আছে, এবং এই (কিন্তু উচিত নয়) ওপর প্রভাব ফেলতে পারে লুপ আচরণকে বর্ণনা করেছেন।
এছাড়াও, c++
প্রাক-ইনক্রিমেন্ট ফর্মটি ব্যবহার করা এটি সাধারণত নিরাপদ (++i
) কারণ এটি আরও সহজেই অনুকূলিত। (স্কট ল্যাংহ্যাম আমাকে এই জোয়ারে মারধর করলেন ।
আমি অন্য ভাষার জন্য জানি না তবে জাভাতে ++ আমি হ'ল একটি প্রিফিক্স ইনক্রিমেন্ট যার অর্থ: আমি 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);
} এবং আউটপুটটি হ'ল: