"X = x ++" এর পরে এক্স কি?


285

এটি কার্যকর হলে (পর্দার পিছনে) কী ঘটে?

int x = 7;
x = x++;

অর্থাত, যখন কোনও ভেরিয়েবল পোস্ট বর্ধিত হয় এবং একটি বিবৃতিতে নিজেকে নির্ধারিত হয়? আমি এটি সংকলন এবং সম্পাদন করেছি। পুরো বিবৃতি পরেx এখনও 7 । আমার বইতে, এটি বাড়ানো হয়েছে বলে!x


9
এটি ব্যবহার করে দেখুন: int x = 7; x = ++x;অবশ্যই এটি এখনও ভয়াবহ কোড, আপনাকে পুনরায় নিয়োগের দরকার নেই। int x = 7; x++;যথেষ্ট।
সেপ্টেম্বর

7
এটি সত্যিই খারাপ অভ্যাস, আপনি যে লাইনে এটি ব্যবহার করেন একই ভেরিয়েবল পরিবর্তন করবেন না।
ইউসুফ

5
আমি x += 1সম্ভবত লুপগুলিতে বাদে ব্যবহার করতে পছন্দ করব । for(int x=0; x<7; x++)
Svish

2
@ এবং জ্যোতিল্লিবের কোনও অবজেক্ট নেই, কেবল একটি প্রাথমিক মান।
ফোরট্রান

উত্তর:


301

xবর্ধিত হয়। তবে আপনি নিজের মধ্যে পুরানো মানটি নির্ধারণ করছেন x


x = x++;
  1. x++বৃদ্ধি xএবং তার পুরানো মান প্রদান করে returns
  2. x = পুরানো মানটিকে নিজের কাছে ফিরিয়ে দেয়।

সুতরাং শেষ পর্যন্ত, xএটির প্রাথমিক মানটিতে আবার নির্ধারিত হয়।


3
তারপরে, x = ++ x সম্পর্কে আপনি কী বলবেন;
হিশাম মুনির 16

3
@ হিশামমুনির সেক্ষেত্রে xএটি পড়ার আগে প্রথমে বর্ধিত হয়, যাতে আপনি শেষ করেন x + 1

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

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

@ এমেরালডওয়েপন এটি জাভাতে সংজ্ঞায়িত হয়েছে। এটি কেবল সি / সি ++ এ রয়েছে আপনি কি ধরণের শেনিনিগান দেখতে পান?
রহস্যময়

385
x = x++;

সমতুল্য

int tmp = x;
x++;
x = tmp;

46
Lol, পুনরাবৃত্ত সংজ্ঞা জন্য yay। আপনি সম্ভবত করেছি উচিত x=x+1পরিবর্তেx++
user606723

8
@ ব্যবহারকারী 606723: না, আমি পুরো বিবৃতি বোঝাতে চেয়েছি x = x++, কেবল পোস্ট ইনক্রিমেন্ট নয় x++
যুবরাজ জন ওয়েসল

20
আমি মনে করি না যে আরও ব্যাখ্যা ছাড়াই এগুলি সমস্ত দরকারী। উদাহরণস্বরূপ, এটি সত্যও নয় যে x = ++x;এটিও সমান int tmp = x; ++x; x = tmp;, তাই কোন যুক্তির মাধ্যমে আমরা আপনার উত্তরটি সঠিক (যা এটি) সঠিকভাবে অনুমান করতে পারি?
কেভিবি

4
আরও স্পষ্টভাবে এটি asm x=x++ =MOV x,tmp; INC x; MOV tmp,x
forker

3
@ ফোরকার: আমার মনে হয় আপনি যদি প্রসেসর মাইকেল ব্যবহার করছেন প্রসেসরের ক্ষেত্রে প্রযোজ্য সমাবেশ সংক্রান্ত নির্দেশাবলী ব্যবহার করেন তবে এটি আরও পরিষ্কার হবে;)
কার্ল

258

বিবৃতি:

x = x++;

সমান:

tmp = x;   // ... this is capturing the value of "x++"
x = x + 1; // ... this is the effect of the increment operation in "x++" which
           //     happens after the value is captured.
x = tmp;   // ... this is the effect of assignment operation which is
           //     (unfortunately) clobbering the incremented value.

সংক্ষেপে, বিবৃতিটির কোনও প্রভাব নেই।

মূল বিষয়গুলি:

  • পোস্টফিক্স ইনক্রিমেন্ট / হ্রাস অভিব্যক্তির মান হ'ল বর্ধিত / হ্রাস হওয়ার আগে অপারেন্ডের মান । (প্রিফিক্স ফর্মের ক্ষেত্রে, মানটি অপারেশনের পরে অপারেন্ডের মান ,)

  • এলএইচএসকে মান নির্ধারিত করার আগে একটি অ্যাসাইনমেন্ট এক্সপ্রেশনটির আরএইচএস সম্পূর্ণ মূল্যায়ন করা হয় (কোনও বৃদ্ধি, হ্রাস এবং / বা অন্যান্য পার্শ্ব-প্রতিক্রিয়া সহ) ।

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


যদি এটি ইতিমধ্যে সুস্পষ্ট না হয়:

  • "x = x ++;" কোনও প্রোগ্রামে প্রায় অবশ্যই একটি ভুল।
  • ওপি (মূল প্রশ্নের জন্য!) সম্ভবত "x ++" বোঝানো হয়েছে; "x = x ++;" এর পরিবর্তে।
  • একই চলকটিতে অটো ইনক / হ্রাস এবং অ্যাসাইনমেন্টের সংমিশ্রণকারী বিবৃতিগুলি বোঝা শক্ত এবং তাই তাদের যথার্থতা নির্বিশেষে এড়ানো উচিত । এই জাতীয় কোড লেখার দরকার নেই।

আশা করা যায়, FindBugs এবং PMD এর মতো কোড চেকাররা সন্দেহজনক হিসাবে এই জাতীয় কোডটি পতাকাঙ্কিত করবে।


7
পার্শ্ব নোট হিসাবে, ওপি, আপনি সম্ভবত কেবল x++পরিবর্তে বলতে চান x = x++
জন নিউমুয়াস

3
সঠিক, তবে সম্ভবত জোর দিয়ে দিন যে বর্ধিতকরণ ডান হাতের এক্সপ্রেশন মূল্যায়ন পোস্টের পরে ঘটে , তবে বাম হাতের পূর্ব নির্ধারিত কাজ, তাই আপাত "ওভাররাইট"
বোহেমিয়ান

2
এগুলি হাই-স্কুল প্রোগ্রামিং টুইস্টারগুলির মতো মনে হচ্ছে ... আপনার বেসিকগুলি পরিষ্কার করা ভাল!
কুমারহর্ষ

1
@ অ্যালবার্তো - এটা শুনে ভাল লাগল যে আপনি "বিশেষজ্ঞের" বক্তব্যকে "সুসমাচারের সত্য" হিসাবে গ্রহণ করেন না। তবে, আমি যা বলেছি তা যাচাই করার আরও ভাল উপায় হ'ল জেএলএসের সাথে পরামর্শ করা। আপনার সংকলন / ডিকম্পাইল পরীক্ষা কেবলমাত্র যা বলেছি তা একটি জাভা সংকলকের জন্য বৈধ shows অন্যরা (অনুমানমূলক) আলাদা আচরণ করতে পারে ... জেএলএস এর অনুমতি দেয় না তা বাদ দিয়ে except
স্টিফেন সি

4
কেবলমাত্র একটি এফওয়াইআই: এটি প্রথমে একটি অন্য প্রশ্নের জন্য পোস্ট করা হয়েছিল, যা এটির সদৃশ হিসাবে বন্ধ হয়ে গেছে এবং এখন একীভূত করা হয়েছে।
শোগ

33
int x = 7;
x = x++;

এটি সি তে এবং জাভার জন্য এই উত্তরটি অপরিবর্তিত রয়েছে । এটি কি হয় সংকলক উপর নির্ভর করে।


4
না এটি আপনার উদ্ধৃত উত্তর অনুসারে
সংকলকটির

@ মিঃ_আর_আমস_ডি তারপরে কিসের উপর নির্ভর করে?
ম্যাক

2
এটি সি-এর পক্ষে কেবল অপরিজ্ঞিত আচরণ behavior এমনকি এটি বলা এটি সংকলকের উপর নির্ভর করে বিভ্রান্তিমূলক - এটি বোঝায় যে সংকলকটি এই ধরণের আচরণ নির্দিষ্ট করে। আমি আমার ভোটটি ফিরিয়ে দিচ্ছি তবে আপনার উত্তরটি সম্পাদনা বিবেচনা করছি - সম্পাদনা করুন: ওফস্ আমি করতে পারি না - আপনাকে প্রথমে এটি সম্পাদনা করতে হবে: ডি
মিস্টার_আর_মিসি_ডি

16

মত একটি নির্মাণ x = x++;ইঙ্গিত দেয় আপনি সম্ভবত ভুল বোঝাবুঝি ++অপারেটর কি করে:

// original code
int x = 7;
x = x++;

++অপারেটর অপসারণের উপর ভিত্তি করে একই জিনিসটি করতে এটি পুনরায় লিখুন :

// behaves the same as the original code
int x = 7;
int tmp = x; // value of tmp here is 7
x = x + 1; // x temporarily equals 8 (this is the evaluation of ++)
x = tmp; // oops! we overwrote y with 7

এখন, আসুন এটি করতে পুনরায় লিখুন (আমি যা মনে করি) আপনি যা চেয়েছিলেন:

// original code
int x = 7;
x++;

তনিমা কিছু এখানে আছে ++অপারেটর মডিফাই পরিবর্তনশীলx , যেমন একটি অভিব্যক্তি অসদৃশ x + x, যা একটি int- এ মান নির্ণয় কিন্তু ছেড়ে পরিবর্তনশীল হবে xনিজেই অপরিবর্তিত। সম্মানজনক forলুপ মত একটি নির্মাণ বিবেচনা করুন :

for(int i = 0; i < 10; i++)
{
    System.out.println(i);
}

i++সেখানে লক্ষ্য করুন ? এটা একই অপারেটর। আমরা এই forলুপটি আবার লিখতে পারি এবং এটি একই আচরণ করে:

for(int i = 0; i < 10; i = i + 1)
{
    System.out.println(i);
}

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


13

ক্লাস ফাইলগুলি থেকে প্রাপ্ত বাইট কোড অনুসারে ,

উভয় অ্যাসাইনমেন্ট ইনক্রিমেন্ট এক্স, তবে পার্থক্য হ'ল সময় when the value is pushed onto the stack

ইন Case1, বর্ধনের আগে পুশ ঘটে (এবং তারপরে পরে নির্ধারিত) (মূলত যার অর্থ আপনার বর্ধন কিছুই করে না)

ইন Case2, বর্ধন প্রথমে ঘটে (এটি 8 তৈরি করে) এবং তারপরে স্ট্যাকের উপরে ঠেলা (এবং তারপরে এক্সকে নির্ধারিত)

মামলা 1:

int x=7;
x=x++;

বাইট কোড:

0  bipush 7     //Push 7 onto  stack
2  istore_1 [x] //Pop  7 and store in x
3  iload_1  [x] //Push 7 onto stack
4  iinc 1 1 [x] //Increment x by 1 (x=8)
7  istore_1 [x] //Pop 7 and store in x
8  return       //x now has 7

কেস 2:

int x=7; 
x=++x;

বাইট কোড

0  bipush 7     //Push 7 onto stack
2  istore_1 [x] //Pop 7 and store in x
3  iinc 1 1 [x] //Increment x by 1 (x=8)
6  iload_1  [x] //Push x onto stack
7  istore_1 [x] //Pop 8 and store in x
8  return       //x now has 8
  • এখানে স্ট্যাকটি বোঝায় অপেরাড স্ট্যাক, স্থানীয়: এক্স সূচক: 1 টাইপ: ইন্ট

আপনি দয়া করে আপনার উত্তর বিস্তারিতভাবে ব্যাখ্যা করতে পারেন?
নীহার

দয়া করে রেফারেন্সকৃত লিঙ্ক এবং মন্তব্যগুলিতে একবার
নজর দিন


8

পোস্ট বর্ধন অপারেটর নিম্নলিখিত হিসাবে কাজ করে:

  1. অপারেন্ডের আগের মান সঞ্চয় করুন।
  2. অপারেন্ডের মান বৃদ্ধি করা।
  3. অপারেন্ডের আগের মানটি ফিরিয়ে দিন।

সুতরাং বিবৃতি

int x = 7;
x = x++; 

নিম্নলিখিত হিসাবে মূল্যায়ন করা হবে:

  1. x এর মান 7 দিয়ে শুরু করা হয়েছে
  2. পোস্ট ইনক্রিমেন্ট অপারেটর ফিরে আসার জন্য x এর আগের মান value
  3. এক্স বৃদ্ধি করে, তাই এখন এক্স 8 হয়
  4. X এর পূর্ববর্তী মান অর্থাৎ 7 প্রদান করে এবং এটি আবার x এ নির্ধারিত হয়, তাই এক্স আবার 7 হয়

সুতরাং এক্সটি প্রকৃতপক্ষে বৃদ্ধি পেয়েছে তবে যেহেতু এক্স ++ এক্সকে এক্স পুনরায় বরাদ্দ দিচ্ছে তাই এক্সের মানটি তার আগের মানকে ওভাররাইড করে।


তবে এমএসভিসি এক্স-তে 8. হ্যাঁ জিসিসিতে এবং ঝনঝন x 7. হয়
গ্রীষ্মের সান

7

এক্স বলা হওয়ার পরে ইনক্রিমেন্টিং ঘটে, তাই x এখনও 7. এর সমান +


7

যখন আপনি xএটির জন্য পুনরায় নির্ধারিত মূল্যটি তখনও 7 Try x = ++xএবং চেষ্টা করুন এবং আপনি আরও 8 টি পাবেন

x++; // don't re-assign, just increment
System.out.println(x); // prints 8

6

কারণ এক্স ++ এটিকে ভেরিয়েবলের নিয়োগের পরে মান বাড়িয়ে দেয়। এবং এই লাইনটি কার্যকর করার সময়:

x++;

ভেরিয়ালব এক্স এর এখনও মূল মান (7) থাকবে তবে এক্সটিকে আবার অন্য লাইনে ব্যবহার করা হবে যেমন

System.out.println(x + "");

আপনি 8 দিতে হবে।

আপনি যদি আপনার অ্যাসাইনমেন্ট স্টেটমেন্টে এক্স এর বর্ধিত মান ব্যবহার করতে চান তবে ব্যবহার করুন

++x;

এটি এক্স দ্বারা 1 দ্বারা বৃদ্ধি পাবে, তারপরে এই মানটি ভেরিয়েবল এক্সকে নির্ধারণ করে।

[সম্পাদনা] x = x ++ এর পরিবর্তে, এটি মাত্র x ++; প্রাক্তন x এর মূল মানটি নিজের জন্য নির্ধারিত করে, সুতরাং এটি সেই লাইনে আসলে কিছুই করে না।


যেটি বলছে এটি নির্ধারিত হওয়ার পরে বৃদ্ধি পেয়েছে এবং যেটি বলে এটি এটি 8 টি প্রিন্ট করবে এটি নির্ধারণের আগে এটি বৃদ্ধি করে এবং এটি প্রিন্ট করে
আর মার্টিনহো ফার্নান্দেস

যদি x মূলত 7 হয়, System.out.println (স্ট্রিং.ভ্যালুওফ (এক্স ++)); প্রিন্টস 7. আপনি কি নিশ্চিত যে আমরা একই প্রোগ্রামিং ভাষা নিয়ে কথা বলছি?
জোসেফাস

হ্যাঁ আমি. এই আদর্শ দাবির মতো এই আইডিয়োন.com/kj2UU 8 টি মুদ্রণ করে না।
আর মার্টিনহো ফার্নান্দেস

হ্যাঁ, আমি ভুল ছিলাম x = x ++ এক্স বাড়ানোর আগে প্রথমে 7 থেকে x নির্ধারণ করবে। x ++ হিসাবে (যা নিজেই একটি অ্যাসাইনমেন্ট x দুঃখিত আমি এটি দেখিনি।
জোসেফাস

1
আসলে, ইনক্রিমেন্টটি হ'ল প্রথম জিনিসideone.com/xOIDU
আর মার্টিনহো ফার্নান্দেস

4

তখন কি হয় int x = 7; x = x++;?

উত্তর -> এর x++অর্থ প্রথমে এক্সের এক্সপ্রেশনটির জন্য মূল্য ব্যবহার করুন এবং তারপরে এটি 1 বৃদ্ধি করুন
। আপনার ক্ষেত্রে এটিই ঘটে। আরএইচএসে এক্স এর মান এলএইচএসে পরিবর্তনশীল x এ অনুলিপি করা হয় এবং তারপরে এর মান x1 দ্বারা বাড়ানো হয়।

একইভাবে ++x মানে ->একের পর প্রথম x এর মান বৃদ্ধি এবং তারপর এক্সপ্রেশনে ব্যবহার করুন।
সুতরাং আপনার ক্ষেত্রে আপনি x = ++x ; // where x = 7
8 এর মান পাবেন।

আরও স্পষ্টতার জন্য কতগুলি মুদ্রণ বিবৃতি নিম্নলিখিত কোডটি কার্যকর করবে তা জানার চেষ্টা করুন

while(i++ <5)   
  printf("%d" , ++i);   // This might clear your concept upto  great extend

সঠিক নয় "আরএইচএসে এক্স এর মানটি এলএইচএসে পরিবর্তনশীল x এ অনুলিপি করা হয় এবং তারপরে x এর মান 1 দ্বারা বৃদ্ধি করা হয় - xএটি 8 হবে, তবে এটি 7 - পড়া এবং অ্যাসাইনমেন্টের মধ্যে বর্ধন ঘটে
ব্যবহারকারী 85421

3

++xপ্রি-ইনক্রিমেন্ট ->এক্স ব্যবহার করার আগে বৃদ্ধি করা হয়
x++ হল পোস্ট-বৃদ্ধি ->এক্স মান বৃদ্ধি হয় পরে ব্যবহার করা হচ্ছে

int x = 7; -> x get 7 value <br>
x = x++; -> x get x value AND only then x is incremented

1

সুতরাং এর অর্থ: x++সমান নয়x = x+1

কারণ:

int x = 7; x = x++;
x is 7

int x = 7; x = x = x+1;
x is 8

এবং এখন এটি কিছুটা অদ্ভুত বলে মনে হচ্ছে:

int x = 7; x = x+=1;
x is 8

খুব সংকলক নির্ভর!


2
কে বলেছিল যে এটি প্রথম স্থানে সমান?
ফোরট্রান

1
আমি যদি আপনি হতাম আমি এই বইগুলি তাত্ক্ষণিকভাবে এক্সডি ট্র্যাশ করে ফেললাম যে কোনও ক্ষেত্রে, এটি (x = x + 1, x-1)সি এর মতো হবে , যেখানে কমা দ্বারা পৃথক অভিব্যক্তি অনুমোদিত।
27:51

3
@ ফুর্তরান: ঠিক আছে, পৃষ্ঠাতে আমার "জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ, তৃতীয় সংস্করণ" এর দশক পুরানো অনুলিপিতে এটিতে বলা হয়েছে "" i ++ প্রকাশটি i = i + 1 এর সমান, কেবলমাত্র আমার একবার মূল্যায়ন করা হয় "। কে বলেছিলেন এটি প্রথম স্থানে? জেমস গোসলিং, এটি উপস্থিত হবে the জাভা স্পেসের এই সংস্করণের এই অংশটি অসাধারণ এবং অস্পষ্টভাবে নির্দিষ্ট; আমি ধারণা করি যে পরবর্তী সংস্করণগুলি প্রকৃত অপারেটর শব্দার্থকে আরও স্পষ্টভাবে প্রকাশ করার জন্য ভাষাটি পরিষ্কার করেছে
এরিক লিপার্ট

2
@ ফিফর্টান: "কেবলমাত্র আমি একবারে মূল্যায়ন না করে" স্ট্যান্ডার্ডটি "এম ()। x ++" এর মতো অভিব্যক্তি কেবল একবার এম () কল করে vey একটি কম অস্পষ্ট এবং আরও সঠিক শব্দটি জোর দিয়েছিল যে আমি তার স্টোরেজ অবস্থান নির্ধারণের জন্য ভেরিয়েবল হিসাবে মূল্যায়নের মধ্যে পার্থক্য রয়েছে - যা এখানে "কেবল একবার মূল্যায়ন" বলতে বোঝায় - এবং সেই সঞ্চয় স্থানটিতে পড়া বা লেখা - - যার মধ্যে 'মূল্যায়ন' এর যুক্তিসঙ্গত কিন্তু ভুল ব্যাখ্যা হতে পারে। স্পষ্টত স্টোরেজের অবস্থানটি পড়তে এবং লিখিত উভয়ই হতে পারে!
এরিক লিপার্ট

1
"খুব সংকলক নির্ভর" - মোটেও না!
স্টিফেন সি

-1

x = x ++;

এটি পোস্ট-ইনক্রিমেন্ট অপারেটর। এটি "অপারেন্ডের মানটি ব্যবহার করুন এবং তারপরে অপারেন্ড বৃদ্ধি করুন" হিসাবে বোঝা উচিত।

যদি আপনি বিপরীতটি ঘটতে চান অর্থাৎ "অপারেন্ড বৃদ্ধি করুন এবং তারপরে অপারেন্ডের মানটি ব্যবহার করুন", তবে আপনাকে অবশ্যই নীচের মত প্রি-ইনক্রিমেন্ট অপারেটরটি ব্যবহার করতে হবে।

x = ++ এক্স;

এই অপারেটরটি প্রথমে x এর মান 1 দ্বারা বাড়ায় এবং তারপরে x এ মান নির্ধারণ করে।


-1

আমি মনে করি এই বিতর্কটি কোডের মধ্যে না গিয়ে সমাধান করা যেতে পারে এবং কেবল চিন্তাভাবনা না করে।

ফানক 1 এবং ফানক 2 বলুন, i++ এবং ++ i কে ফাংশন হিসাবে বিবেচনা করুন।

এখন আমি = 7;
ফানক 1 (আই ++) 7 ফেরত দেয়, ফানক 2 (++ i) 8 ফেরত দেয় (প্রত্যেকে এটি জানেন)। অভ্যন্তরীণভাবে উভয় ফাংশন i থেকে 8 বৃদ্ধি করে তবে তারা বিভিন্ন মান দেয়।

সুতরাং i = i ++ ফাংশনটিকে Func1 বলে। ফাংশনের ভিতরে আমি বাড়িয়ে 8 করে, তবে সম্পূর্ণ হওয়ার পরে ফাংশনটি 7 ফিরে আসে returns

সুতরাং শেষ পর্যন্ত 7 বরাদ্দ হয়ে যায় i। (সুতরাং শেষ পর্যন্ত, i = 7)


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

-2

এটি কারণ আপনি পোস্ট-ইনক্রিমেন্ট অপারেটর ব্যবহার করেছেন। এই নিম্নলিখিত কোড লাইন

x = x++;

যা হয় তা হ'ল, আপনি x এর সাথে x এর মান নির্ধারণ করছেন। x ++ ইনক্রিমেন্টস x এর পরে x এর মান নির্ধারিত হয়। এভাবেই পোস্ট-ইনক্রিমেন্ট অপারেটররা কাজ করে। একটি বিবৃতি কার্যকর করার পরে তারা কাজ করে। সুতরাং আপনার কোডে, এক্স প্রথমে ফিরে আসে তারপরে এটি পরে বাড়ানো হয়।

যদি তুমি কর

x = ++x;

উত্তরটি 8 হবে কারণ আপনি প্রি-ইনক্রিমেন্ট অপারেটরটি ব্যবহার করেছেন। এটি x এর মান ফেরত দেওয়ার আগে প্রথমে মান বাড়ায়।

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