পোস্ট ইনক্রিমেন্ট (আই ++) এবং প্রাক ইনক্রিমেন্ট (++ i) অপারেটররা জাভাতে কীভাবে কাজ করবেন?


103

আপনি কি আমাকে এই জাভা কোডটির আউটপুট ব্যাখ্যা করতে পারেন?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

উভয় ক্ষেত্রেই আউটপুট 20 হয়


9
Always avoid ambiguous statements :)
Prasoon Saurav

9
@Prasoon Saurav Unlike C and C++, Java and C# have strictly defined order of evaluation, so these statements are not ambiguous.
Pete Kirkham

12
I know that but still those statements are not(can not be) used for practical purpose so one must avoid it.
Prasoon Saurav


4
@ পেটকিরখাম এটি ছয় বছর পরে গেছে, তবে আমি এখনও উল্লেখ করতে চাই যে "অস্পষ্ট" এই পরিস্থিতিতে, অস্পষ্ট - এটির অর্থ "সংকলকটি কী রাখবে তা জানে না", বা এর অর্থ "প্রোগ্রামার" হতে পারে এর অর্থ কী তা সম্পর্কে কোনও ধারণা নেই।
মনিকা এর মামলা মামলা

উত্তর:


155

এটা কি সাহায্য করে?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

মূল বিষয়টি হ'ল ++aমানটি বৃদ্ধি করে এবং তাৎক্ষণিকভাবে এটি প্রদান করে।

a++ মানটিকেও (পটভূমিতে) বাড়িয়ে দেয় তবে ভেরিয়েবলের অপরিবর্তিত মানটি দেয় - যা দেখতে পরে কার্যকর করা হয় তা দেখে looks


5
Are you sure a == 9 in the second one?
Pete Kirkham

1
i = ++ এ +++ এ + এ ++; => আই = 7 + 8 + 5; (a = 8) যেহেতু পোস্ট ইনক্রিমেন্টের সর্বাধিক অগ্রাধিকার রয়েছে, তাই কি একটি ++ প্রথমে কার্যকর করা হয়?
09

4
এমন কিছুর জটিল উদাহরণ যা ব্যাখ্যা করা সহজ।
ওজনস

এই উত্তরটি কি সি # এবং সি ++ এর জন্য একই?
ওয়ার্কওভারফ্লো

এখানে a, b এবং c সমান 2 কেন হয়? int a = 1; int b = a++; int c = ++b;এটি পোস্ট ইনক্রিমেন্টের কারণে খ 1 হবে বলে আশা করছিল।
ডেনিস

208

++aইনক্রিমেন্ট এবং তারপরে ভেরিয়েবল ব্যবহার করে।
a++ব্যবহার করে এবং তারপরে পরিবর্তনশীল বৃদ্ধি করে।

যদি তোমার থাকে

a = 1;

এবং তুমি কর

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

কোডাডিক্টিক্ট আপনার নির্দিষ্ট স্নিপেটটি ব্যাখ্যা করে।


67

উভয় ক্ষেত্রে এটি প্রথমে মান গণনা করে, তবে উত্তরোত্তর ক্ষেত্রে এটি পুরানো মান ধারণ করে এবং গণনার পরে এটি প্রদান করে

++ এ

  1. a = a + 1;
  2. ফিরে a;

a ++

  1. অস্থায়ী = ক;
  2. a = a + 1;
  3. রিটার্ন অস্থায়ী

8
পরিষ্কার উত্তর
কার্তিক চুগ

4
এই তিনিই আমাকে পরিষ্কার বুঝতে পেরেছিলেন .. ধন্যবাদ
পুনর্মনরব

22
i = ++a + ++a + a++;

হয়

i = 6 + 7 + 7

কাজ করা : ইনক্রিমেন্ট এ 6 (বর্তমান মান 6) + ইনক্রিমেন্ট এ 7 (বর্তমান মান 7)। যোগফল 13 এখন এটি একটি (= 7) এর বর্তমান মানের সাথে যুক্ত করুন এবং তারপরে 8 এ বৃদ্ধি করুন যোগফল 20 এবং অ্যাসাইনমেন্টটি সম্পূর্ণ হওয়ার পরে এর মান 8 হয়।

i = a++ + ++a + ++a;

হয়

i = 5 + 7 + 8

কাজ করা : ক এর শুরুতে মূল্য হ'ল 5 এটি যুক্ত করুন এবং তারপরে এটি 6 বৃদ্ধি করুন (বর্তমান মান 6)। + এর অন্যান্য অপরেন্ড পেতে বর্তমান মান 6 থেকে 7 বৃদ্ধি করুন a যোগফলটি 12 এবং এর বর্তমান মান 7 হয়। পরবর্তী বৃদ্ধি একটি 7 থেকে 8 (বর্তমান মান = 8) এবং 20 পাওয়ার জন্য এটি পূর্ববর্তী যোগ 12 এ যুক্ত করুন।


এই বিবৃতি ডান থেকে বাম বা বাম থেকে ডানে কাজ করে?
অভিজিৎ

10

++aaমূল্যায়ন করার আগে বর্ধিতকরণ । a++মূল্যায়ন aএবং তারপরে এটি বৃদ্ধি করে।

আপনার দেওয়া মত প্রকাশের সাথে সম্পর্কিত:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

আমি উপরে ব্যবহৃত প্যারেন্টিগুলি জাভা দ্বারা স্পষ্টভাবে ব্যবহার করা হয়েছে। আপনি যদি এইভাবে শর্তাদি দেখেন তবে আপনি সহজেই দেখতে পাচ্ছেন যে, এগুলি উভয়ই একই রকম যেমন তারা চলাফেরা করে।


4
@ ক্লাসলিন্ডবুকের পরিবর্তিত অর্থ হ'ল আপনি উভয় অভিব্যক্তিই অদলবদল করতে পারেন এবং এখনও একই ফলাফল পেতে পারেন। সুতরাং a ++ + ++ a == ++ এ + এ ++ (5 + 7 == 6 + 6; এ == 7 শেষে)।
অর্রিল

8

উপরের উদাহরণে

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29

4

++ এ হ'ল উপসর্গ ইনক্রিমেন্ট অপারেটর:

  • ফলাফল গণনা করা হয় এবং প্রথমে সংরক্ষণ করা হয়,
  • তারপরে ভেরিয়েবল ব্যবহার করা হয়।

a ++ হল পোস্টফিক্স ইনক্রিমেন্ট অপারেটর:

  • ভেরিয়েবলটি প্রথমে ব্যবহৃত হয়,
  • তারপরে ফলাফল গণনা করা হয় এবং সংরক্ষণ করা হয়।

একবার আপনি নিয়মগুলি মনে রাখবেন, ইয়া জন্য সব কিছু গণনা করার জন্য!


4

অনুমান করা হচ্ছে যে আপনি বোঝাতে চেয়েছিলেন

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

এটি মূল্যায়ন করে:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

সুতরাং আমি 6 + 7 + 7 = 20 এবং তাই 20 মুদ্রিত হয়।

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

সুতরাং আমি 5 + 7 + 8 = 20 এবং তাই 20 আবার মুদ্রিত হয়।

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

এবং ডান হাতের সমস্তটি মূল্যায়নের পরে (একটিতে 8 সেট করা সহ) এর পরে 6 + 7 + 7 = 20 এ সেট করা হয় এবং তাই 20 টি একটি চূড়ান্ত সময় মুদ্রিত হয়।


3

যখন a5 হয়, তখন a++এক্সপ্রেশনকে একটি 5 দেয় এবং aতারপরে বৃদ্ধি হয়, যখন সংখ্যাটি এক্সপ্রেশন করার আগে ++aইনক্রিমেন্ট a(যা দেয়a এই ক্ষেত্রে এক্সপ্রেশনটিকে 6 )।

সুতরাং আপনি গণনা

i = 6 + 7 + 7
i = 5 + 7 + 8

3

আমি বিশ্বাস করি তবে আপনি যদি আপনার সমস্ত বিবৃতি একত্রিত করেন এবং এটি জাভা 8.1 এ চালান তবে আপনি একটি পৃথক উত্তর পাবেন, কমপক্ষে আমার অভিজ্ঞতা যা বলেছিল তাই।

কোডটি এইভাবে কাজ করবে:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29

3

প্রাক-বর্ধিতকরণের অর্থ হল অভিব্যক্তিতে মূল্যায়ন করার আগে ভেরিয়েবলটি বর্ধিত হয়। পোস্ট-ইনক্রিমেন্টের অর্থ হ'ল ভেরিয়েবলটি বর্ধিত হয় এর পরে এটি প্রকাশের ক্ষেত্রে ব্যবহারের জন্য মূল্যায়ন করা হয়।

অতএব, সাবধানে দেখুন এবং আপনি দেখতে পাবেন যে তিনটি অ্যাসাইনমেন্ট গাণিতিকভাবে সমতুল্য।


2

প্রি-ইনক্রিমেন্ট এবং পোস্ট ইনক্রিমেন্ট সমান হয় যদি একটি অভিব্যক্তিতে না থাকে

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10

0
a=5; i=++a + ++a + a++;

হয়

i = 7 + 6 + 7

কাজ করা: প্রাক / পোস্ট ইনক্রিমেন্টের "ডান থেকে বাম" সমিতি রয়েছে, এবং পোস্টের চেয়ে পূর্বের অগ্রাধিকার রয়েছে, সুতরাং সমস্ত প্রাক বর্ধনের প্রথমটি হিসাবে সমাধান করা হবে (++a + ++a) => 7 + 6। তারপরে a=7পোস্ট ইনক্রিমেন্ট => 7 + 6 + 7 =20এবং সরবরাহ করা হয় a =8

a=5; i=a++ + ++a + ++a;

হয়

i=7 + 7 + 6

ওয়ার্কিং: প্রাক / পোস্ট বৃদ্ধি হয়েছে Associativity, এবং প্রাক "বাম থেকে ডানে" পোস্ট বেশি প্রাধান্য আছে, তাই সব প্রাক বৃদ্ধি প্রথম যেমন সমাধান হবে (++a + ++a) => 7 + 6.then a=7পোস্ট ইনক্রিমেন্ট প্রদান করা => হয় 7 + 7 + 6 =20এবং a =8


0

আমি বিশ্বাস করি আপনি এই সমস্ত বিবৃতি এক সাথে
কার্যকরভাবে চালাচ্ছেন ফলাফল => 38, 29 এর ফলাফল হবে

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.