X == (x = y) কেন (x = y) == x নয়?


207

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

class Quirky {
    public static void main(String[] args) {
        int x = 1;
        int y = 3;

        System.out.println(x == (x = y)); // false
        x = 1; // reset
        System.out.println((x = y) == x); // true
     }
}

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

প্রথম প্রকাশটি কেন মূল্যায়ন করে falseতবে দ্বিতীয়টি মূল্যায়ন করে true? আমি (x = y)প্রথমে মূল্যায়ন করার আশা করতাম এবং তারপরে এটি xনিজের সাথে তুলনা করে ( 3) এবং ফিরে আসত true


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

int oldX = x;
x = y;
return oldX == y;

যা, x86 সিএমপিএক্সসিএইচজি নির্দেশের চেয়েও সহজ, জাভাতে একটি সংক্ষিপ্ত প্রকাশের দাবিদার।


62
বাম হাতটি সর্বদা ডান হাতের আগে মূল্যায়ন করা হয়। বন্ধনীগুলি এতে কোনও পার্থক্য করে না।
লুই ওয়াসারম্যান

11
অভিব্যক্তিটির মূল্যায়ন x = yঅবশ্যই প্রাসঙ্গিক, এবং এর পার্শ্ব প্রতিক্রিয়ার কারণ হয়ে যায় xযা এর মানকে সেট করে y
লুই ওয়াসারম্যান

50
নিজেকে এবং আপনার সতীর্থকে একটি উপকার করুন এবং রাষ্ট্র পরীক্ষার মতো একই লাইনে রাষ্ট্রীয় পরিবর্তনকে মিশ্রিত করবেন না। এমনভাবে করা আপনার কোডের পঠনযোগ্যতা হ্রাস করে। (এমন কিছু ঘটনা রয়েছে যেখানে পারমাণবিকতার প্রয়োজনীয়তার কারণে এটি একেবারে প্রয়োজনীয়, তবে ইতিমধ্যে বিদ্যমান ব্যক্তিদের জন্য কাজগুলি এবং তাদের উদ্দেশ্য তাত্ক্ষণিকভাবে স্বীকৃত হবে))
jpmc26

50
আসল প্রশ্নটি হল আপনি কেন এই জাতীয় কোড লিখতে চান।
klutt

26
আপনার প্রশ্নের মূল চাবিকাঠি হ'ল আপনার মিথ্যা বিশ্বাস যে প্রথম বন্ধনী মূল্যায়ন আদেশকে বোঝায়। প্রাথমিক বিদ্যালয়ে আমরা কীভাবে গণিত শিখিয়েছি এবং যেহেতু কিছু প্রাথমিক প্রোগ্রামিং বইগুলি এখনও এটিকে ভুল করে তোলে , এটি একটি সাধারণ বিশ্বাস but তবে এটি একটি মিথ্যা বিশ্বাস। এটি একটি খুব ঘন ঘন প্রশ্ন। বিষয়টিতে আমার নিবন্ধগুলি পড়ে আপনি উপকৃত হতে পারেন; তারা সি # সম্পর্কে তবে তারা জাভাতে প্রয়োগ হয়: এরিক্লিপার্ট. com
এরিক লিপার্ট

উত্তর:


97

যা, বন্ধনীর সাহায্যে অর্ডার দ্বারা প্রথমে গণনা করা উচিত

না। এটি একটি সাধারণ ভুল ধারণা যে বন্ধনীর গণনা বা মূল্যায়নের আদেশের উপর কোনও (সাধারণ) প্রভাব রয়েছে। তারা কেবল আপনার অভিব্যক্তির অংশগুলিকে একটি নির্দিষ্ট গাছে জোর করে, ডান ক্রিয়াকলাপকে কাজের জন্য সঠিক ক্রিয়ায় আবদ্ধ করে।

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

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

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

শিক্ষকদের "এটি এর আগে সংযোজনটি প্রথম ঘটায়" এর মতো বিভ্রান্তিকর বাক্যাংশ ব্যবহার করে অপারেটর প্রাধান্য ব্যাখ্যা করা বন্ধ করতে হবে। একটি অভিব্যক্তি দেওয়া x * y + zযথাযথ ব্যাখ্যা হবে "অপারেটর প্রাধান্য উপরন্তু মধ্যে ঘটতে তোলে x * yএবং zবরং মধ্যে পরিবর্তে, yএবং zকোন" অর্ডার "কোনো উল্লেখ সঙ্গে,"।


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

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

5
@ জনপি: আরও খারাপ হয়। 5 * 4 এর অর্থ কি 5 + 5 + 5 + 5 বা 4 + 4 + 4 + 4 + 4? কিছু শিক্ষক জোর দিয়েছিলেন যে এই পছন্দগুলির মধ্যে একটি মাত্র সঠিক।
ব্রায়ান

3
@ ব্রায়ান কিন্তু ... তবে ... আসল সংখ্যার গুণন কমিটিকেটিভ!
18-18

2
আমার চিন্তার জগতে, এক জোড়া বন্ধনী প্রতিনিধিত্ব করে "এর জন্য প্রয়োজনীয়"। *A * (b + c) Calc গণনা করে প্রথম বন্ধনীগুলি প্রকাশ করবে যে সংখ্যার ফলাফলটি গুণনের জন্য প্রয়োজন । এলএইচএস-ফার্স্ট বা আরএইচএস-প্রথম বিধিগুলি বাদে কোনও প্রচ্ছন্ন অপারেটরের পছন্দ প্যারেন্স দ্বারা প্রকাশ করা যেতে পারে । (এটি কি সত্য?) @ ব্রায়ান গণিতে এমন কয়েকটি বিরল ঘটনা রয়েছে যেখানে বারবার সংযোজন দ্বারা গুণকে প্রতিস্থাপন করা যেতে পারে তবে এটি সর্বদা সত্য নয় (জটিল সংখ্যা দিয়ে শুরু করে তবে সীমাবদ্ধ নয়)। সুতরাং আপনার শিক্ষাব্রতীদের লোকেরা কী বলছে তা সত্যই লক্ষ্য করা উচিত ....
সিক করুন

164

==একটি বাইনারি সমতা অপারেটর

বাঁদিকের প্রতীক একটি বাইনারি অপারেটর সম্পূর্ণরূপে মূল্যায়ন করা মনে হচ্ছে, সামনে কোন অংশ ডানদিকের প্রতীক মূল্যায়ন করা হয়।

জাভা 11 স্পেসিফিকেশন> মূল্যায়ন আদেশ> বাম-হাত অপারেন্ডকে প্রথমে মূল্যায়ন করুন


42
শব্দটি "উপস্থিত বলে মনে হচ্ছে" তারা নিশ্চিত বলে মনে হয় না, টিবিএইচ।
মিস্টার লিস্টার

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

24
@ এমআরলিস্টার "মনে হচ্ছে" তাদের পক্ষে একটি খারাপ শব্দ পছন্দ বলে মনে হচ্ছে। "উপস্থিত" দ্বারা তাদের অর্থ "বিকাশকারীদের কাছে একটি ঘটনা হিসাবে প্রকাশ"। "কার্যকরভাবে" একটি ভাল বাক্যাংশ হতে পারে।
কেলভিন

18
সি ++ সম্প্রদায়ে এটি "বিস্ময়কর" নিয়মের সমতুল্য ... অপরেন্দ্রকে "যেমন" আচরণ করা প্রয়োজন তবে নীচের নিয়ম অনুসারে এটি প্রয়োগ করা হয়েছিল, এমনকি প্রযুক্তিগতভাবে তা না হলেও।
মাইকেল ইডেনফিল্ড

2
@ ক্যালভিন আমি সম্মত, আমি এই শব্দটি "প্রদর্শিত হবে" এর পরিবর্তে বাছাই করতাম।
এমসি সম্রাট

149

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

//the example values
x = 1;
y = 3;

সুতরাং প্রথম আউটপুট গণনা করার জন্য System.out.println(), নিম্নলিখিতটি করা হয়:

x == (x = y)
1 == (x = y)
1 == (x = 3) //assign 3 to x, returns 3
1 == 3
false

এবং দ্বিতীয় গণনা:

(x = y) == x
(x = 3) == x //assign 3 to x, returns 3
3 == x
3 == 3
true

উল্লেখ্য, দ্বিতীয় মান সবসময় প্রাথমিক মূল্যবোধের, সত্য নির্ণয় করা হবে নির্বিশেষে xএবং y, কারণ আপনি কার্যকরভাবে পরিবর্তনশীল এটা নির্ধারিত হয় একটি মান এর নিয়োগ তুলনা করা হয়, এবং a = bএবং b, যাতে মূল্যায়ন করবে, সবসময় একই হতে সংজ্ঞানুসারে.


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

25

আমি নিশ্চিত নই যে জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনে এমন কোনও আইটেম রয়েছে যা ভেরিয়েবলের আগের মানটি লোড করার নির্দেশ দেয় ...

এখানে. স্পেসিফিকেশনটি কী বলে পরবর্তী সময় আপনি অস্পষ্ট, দয়া করে স্পেসিফিকেশনটি পড়ুন এবং তারপর এটি অস্পষ্ট কিনা তা প্রশ্ন করুন it

... ডান দিকটি (x = y)যা বন্ধনী দ্বারা অর্পিত আদেশ অনুসারে প্রথমে গণনা করা উচিত।

উক্তিটি মিথ্যা। অভিভাবকরা মূল্যায়নের আদেশকে বোঝায় না । জাভাতে, প্রথম বন্ধনী নির্বিশেষে মূল্যায়নের ক্রমটি বাম থেকে ডানে চলে যায়। অভিভাবকরা নির্ধারণের ক্রম নয়, স্যুপ এক্সপ্রেসনের সীমানা কোথায় তা নির্ধারণ করে।

প্রথম অভিব্যক্তিটি মিথ্যা হিসাবে মূল্যায়ন করে তবে দ্বিতীয়টি সত্যের কাছে মূল্যায়ন করে?

==অপারেটরের নিয়মটি হ'ল: একটি মান উত্পাদন করতে বাম দিকটি মূল্যায়ন করুন, একটি মান উত্পাদন করতে ডান দিকটি মূল্যায়ন করুন, মানগুলি তুলনা করুন, তুলনাটি অভিব্যক্তির মান।

অন্য কথায়, এর অর্থ expr1 == expr2সর্বদা একই রকম যেমন আপনি লিখেছেন temp1 = expr1; temp2 = expr2;এবং পরে মূল্যায়ন করেছিলেন temp1 == temp2

=বাম পাশের একটি স্থানীয় ভেরিয়েবল সহ অপারেটরের নিয়মটি হ'ল: একটি ভেরিয়েবল উত্পাদন করতে বাম দিকটি মূল্যায়ন করুন, মান উৎপন্ন করার জন্য ডান দিকটি মূল্যায়ন করুন, কার্য সম্পাদন করুন, ফলাফলটি নির্ধারিত মানটি।

সুতরাং এটি একসাথে রাখুন:

x == (x = y)

আমাদের তুলনা অপারেটর রয়েছে। একটি মান উত্পাদন করতে বাম দিকে মূল্যায়ন - আমরা এর বর্তমান মান পাই x। ডান দিকটি মূল্যায়ন করুন: এটি একটি কার্যনির্বাহী তাই আমরা একটি পরিবর্তনশীল - ভেরিয়েবল উত্পাদন করতে বাম দিকটি xমূল্যায়ন করি - আমরা ডান দিকটি - বর্তমান মানটি y- এটি নির্ধারণ করি xএবং ফলাফল নির্ধারিত মান হিসাবে নির্ধারিত হয়। তারপরে আমরা xনির্ধারিত মানের সাথে মূল মানটির তুলনা করি ।

আপনি (x = y) == xঅনুশীলন হিসাবে করতে পারেন । আবার, মনে রাখবেন, বাম দিকে মূল্যায়নের সব নিয়ম ডান দিকে মূল্যায়নের সব নিয়ম সামনে ঘটতে

আমি প্রত্যাশা করতাম (x = y) প্রথমে মূল্যায়ন করা হবে এবং তারপরে এটি x এর সাথে নিজের (3) তুলনা করে সত্যে ফিরে আসবে।

আপনার প্রত্যাশা জাভা বিধি সম্পর্কে ভুল বিশ্বাস একটি সেট উপর ভিত্তি করে। আশা করি আপনি এখন সঠিক বিশ্বাস এবং ভবিষ্যতে সত্য জিনিস আশা করবে।

এই প্রশ্নটি "জাভা এক্সপ্রেশনে সুব এক্সপ্রেসনগুলির মূল্যায়নের ক্রম" থেকে পৃথক

এই বক্তব্য মিথ্যা। এই প্রশ্নটি সম্পূর্ণ জার্মানী।

x অবশ্যই এখানে 'subexpression' নয়।

এই বিবৃতিও মিথ্যা। এটি প্রতিটি উদাহরণে দু'বার একটি subexpression হয়

এটি 'মূল্যায়ন' না করে তুলনার জন্য লোড করা দরকার।

এ ব্যাপারে আমার কোন ধারনা নেই।

স্পষ্টতই আপনার এখনও অনেক ভ্রান্ত বিশ্বাস রয়েছে। আমার পরামর্শ হ'ল আপনার মিথ্যা বিশ্বাসগুলি সত্য বিশ্বাস দ্বারা প্রতিস্থাপন না করা পর্যন্ত আপনি স্পেসিফিকেশনটি পড়ুন।

প্রশ্নটি জাভা-নির্দিষ্ট এবং এক্সভিশন এক্স == (x = y), সাধারণত ছদ্মবেশী সাক্ষাত্কারের প্রশ্নের জন্য সাধারণত তৈরি করা অবাস্তব গঠনমূলক কাঠামোর মত নয়, আসল প্রকল্প থেকে এসেছে।

অভিব্যক্তির প্রমাণটি প্রশ্নের সাথে প্রাসঙ্গিক নয়। এই জাতীয় অভিব্যক্তির নিয়মগুলি স্পেসিফিকেশনে স্পষ্টভাবে বর্ণিত হয়; এটি পড়ুন!

তুলনা-ও-প্রতিস্থাপন আইডিয়ামটির জন্য এটি এক-লাইন প্রতিস্থাপনের কথা ছিল

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

ঘটনাক্রমে, সি # এর সাথে তুলনা এবং একটি লাইব্রেরি পদ্ধতি হিসাবে প্রতিস্থাপন করা হয়েছে, যা মেশিনের নির্দেশে জিট করা যেতে পারে। আমি বিশ্বাস করি জাভাতে এমন কোনও পদ্ধতি নেই, কারণ এটি জাভা টাইপ সিস্টেমে প্রতিনিধিত্ব করা যায় না।


8
যদি কেউ পুরো জেএলএস দিয়ে যেতে পারে তবে জাভা বই প্রকাশ করার কোনও কারণ নেই এবং এই সাইটের কমপক্ষে অর্ধেকটিও অকেজো হয়ে যাবে।
জন ম্যাকক্লেইন

8
@ জনমিসক্লেইন: আমি আপনাকে আশ্বাস দিচ্ছি, পুরো স্পেসিফিকেশনটি কাটাতে কোনও অসুবিধা নেই, তবে, আপনাকেও করতে হবে না। জাভা স্পেসিফিকেশন একটি সহায়ক "বিষয়বস্তুর সারণি" দিয়ে শুরু হয় যা আপনাকে যে অংশে সবচেয়ে বেশি আগ্রহী তা দ্রুত পেতে আপনাকে সহায়তা করবে It's এটি অনলাইন এবং কীওয়ার্ড অনুসন্ধানযোগ্য। এটি বলেছিল, আপনি সঠিক: এখানে প্রচুর ভাল সংস্থান রয়েছে যা আপনাকে জাভা কীভাবে কাজ করে তা শিখতে সহায়তা করবে; আপনি আমার পরামর্শ হ'ল আপনি সেগুলি ব্যবহার করুন!
এরিক লিপার্ট

8
এই উত্তরটি অহেতুক ঘৃণ্য এবং অভদ্র। মনে রাখবেন: সুন্দর থাকুন
ওয়ালেন

7
@ লুইসগ .: কোন শঙ্কিত উদ্দেশ্য বা নিহিত নয়; আমরা সবাই একে অপরের কাছ থেকে শিখতে এখানে এসেছি, এবং আমি যখন প্রথম ছিলাম তখন আমি নিজেকে কিছু না করার জন্য প্রস্তাব দিই না। না এটা অভদ্র। স্পষ্টভাবে এবং দ্ব্যর্থহীনভাবে তাদের মিথ্যা বিশ্বাসগুলি চিহ্নিত করা মূল পোস্টারের প্রতি দয়া । "ভদ্রতা" এর পিছনে লুকিয়ে থাকা এবং লোকদেরকে মিথ্যা বিশ্বাস অব্যাহত রাখার সুযোগ দেওয়া অসহনীয় , এবং চিন্তার বদ অভ্যাসকে শক্তিশালী করে
এরিক লিপার্ট

5
@ লুইসজি: আমি জাভাস্ক্রিপ্টের নকশা সম্পর্কে একটি ব্লগ লিখতাম, এবং আমার সবচেয়ে সহায়ক মন্তব্যগুলি ছিল ব্রেন্ডন থেকে স্পষ্টভাবে এবং নির্বিঘ্নে নির্দেশ করে যেখানে আমার ভুল হয়েছে। এটি দুর্দান্ত ছিল এবং সময়টি গ্রহণ করার জন্য আমি তাকে প্রশংসা করি, কারণ আমি তখন আমার জীবনের পরবর্তী 20 বছর বেঁচেছিলাম mistake ভুলটি আমার নিজের কাজটিতে বা আরও খারাপভাবে পুনরায় প্রচার না করে অন্যকে শিক্ষা দিয়ে চলেছি। লোকেরা কীভাবে মিথ্যা জিনিস বিশ্বাস করতে আসে তার উদাহরণ হিসাবে নিজেকে ব্যবহার করে অন্যের মধ্যেও সেই একই মিথ্যা বিশ্বাসগুলি সংশোধন করার সুযোগ দেয়।
এরিক লিপার্ট

16

এটি অপারেটরের অগ্রাধিকার এবং অপারেটররা কীভাবে মূল্যায়ন করা হচ্ছে তার সাথে সম্পর্কিত।

অভিজাতদের '()' এর উচ্চতর প্রাধান্য রয়েছে এবং সাহচর্য বাম থেকে ডানে রয়েছে। সাম্যতা '==' এই প্রশ্নের পরে আসে এবং সাহচর্যটি বাম থেকে ডান থাকে। অ্যাসাইনমেন্ট '=' সর্বশেষে আসে এবং ডান থেকে বামে সাহচর্য রয়েছে।

এক্সপ্রেশন মূল্যায়ন করতে সিস্টেম ব্যবহারের স্ট্যাক। এক্সপ্রেশন বাম থেকে ডানে মূল্যায়ন হয়।

এখন আসল প্রশ্নে আসে:

int x = 1;
int y = 3;
System.out.println(x == (x = y)); // false

প্রথম এক্স (1) স্ট্যাকের দিকে ধাক্কা দেওয়া হবে। তারপরে অভ্যন্তরীণ (x = y) মূল্যায়ন করা হবে এবং এক্স (3) মান সহ স্ট্যাকের দিকে ধাক্কা দেওয়া হবে। এখন x (1) কে x (3) এর সাথে তুলনা করা হবে সুতরাং ফলাফলটি মিথ্যা।

x = 1; // reset
System.out.println((x = y) == x); // true

এখানে, (x = y) মূল্যায়ন করা হবে, এখন x মান 3 হবে এবং x (3) স্ট্যাকের দিকে ঠেলে দেওয়া হবে। সমতার পরে পরিবর্তিত মান সহ এখন এক্স (3) স্ট্যাকের দিকে ঠেলে দেওয়া হবে। এখন এক্সপ্রেশন মূল্যায়ন করা হবে এবং উভয় একই হবে তাই ফলাফল সত্য।


12

এটি এক নয়। বাম হাতটি সর্বদা ডান হাতের আগে মূল্যায়ন করা হবে, এবং বন্ধনীগুলি কার্যকর করার আদেশ নির্দিষ্ট করে না, তবে আদেশের একটি দলবদ্ধকরণ ing

সঙ্গে:

      x == (x = y)

আপনি মূলত:

      x == y

এবং এক্স এর তুলনার পরে y এর মান হবে ।

সাথে থাকাকালীন:

      (x = y) == x

আপনি মূলত:

      x == x

পরে এক্স নেন Y এর মান। এবং এটি সর্বদা সত্য ফিরে আসবে ।


9

প্রথম পরীক্ষায় আপনি পরীক্ষা করছেন 1 == 3।

দ্বিতীয় পরীক্ষায় আপনার চেকিং 3 == 3 করে।

(x = y) মান নির্ধারণ করে এবং সেই মানটি পরীক্ষা করা হয়। পূর্ববর্তী উদাহরণে x = 1 প্রথমে তারপর এক্স নির্ধারিত হয় 3. 1 == 3 হয়?

শেষের দিকে, এক্স 3 নির্ধারিত হয়, এবং সম্ভবত এটি এখনও 3। 3 == 3 হয়?


8

এটিকে বিবেচনা করুন, সম্ভবত সহজ উদাহরণ:

int x = 1;
System.out.println(x == ++x); // false
x = 1; // reset
System.out.println(++x == x); // true

এখানে, প্রাক-বর্ধনকারী অপারেটরটি তুলনা করার আগে++x প্রয়োগ করতে হবে - ঠিক যেমন আপনার উদাহরণের মতো তুলনা করার আগে অবশ্যই গণনা করতে হবে ।(x = y)

যাইহোক, অভিব্যক্তি মূল্যায়ন এখনও বাম থেকে → ডানদিকে ঘটে থাকে , সুতরাং প্রথম তুলনাটি আসলে 1 == 2দ্বিতীয়টি হয় 2 == 2
আপনার উদাহরণে একই জিনিস ঘটে।


8

বাম থেকে ডানে এক্সপ্রেশন মূল্যায়ন করা হয়। এক্ষেত্রে:

int x = 1;
int y = 3;

x == (x = y)) // false
x ==    t

- left x = 1
- let t = (x = y) => x = 3
- x == (x = y)
  x == t
  1 == 3 //false

(x = y) == x); // true
   t    == x

- left (x = y) => x = 3
           t    =      3 
-  (x = y) == x
-     t    == x
-     3    == 3 //true

5

মূলত প্রথম বিবৃতি x এর মান 1 ছিল তাই জাভা 1 == নতুন x ভেরিয়েবলের সাথে তুলনা করে যা একই হবে না

দ্বিতীয়টিতে আপনি x = y বলেছিলেন যার অর্থ x এর মান পরিবর্তিত হয়েছে এবং আপনি যখন আবার এটি কল করবেন তখন এটি একই মান হবে তাই এটি সত্য এবং x == x


4

== একটি তুলনা সমতা অপারেটর এবং এটি বাম থেকে ডানে কাজ করে।

x == (x = y);

এখানে x এর পুরানো নির্ধারিত মানকে x এর নতুন নির্ধারিত মানের সাথে তুলনা করা হয়, (1 == 3) // মিথ্যা

(x = y) == x;

অন্যদিকে, এখানে এক্স এর নতুন নির্ধারিত মান তুলনা করার ঠিক আগে নির্ধারিত এক্সের নতুন হোল্ডিংয়ের সাথে তুলনা করা হয়, (3 == 3) // সত্য

এখন এটি বিবেচনা করুন

    System.out.println((8 + (5 * 6)) * 9);
    System.out.println(8 + (5 * 6) * 9);
    System.out.println((8 + 5) * 6 * 9);
    System.out.println((8 + (5) * 6) * 9);
    System.out.println(8 + 5 * 6 * 9);

আউটপুট:

342

278

702

342

278

সুতরাং, প্যারেনথেসিসগুলি তুলনা প্রকাশের ক্ষেত্রেই নয় পাটিগণিতের অভিব্যক্তিতে এর প্রধান ভূমিকা পালন করে।


1
উপসংহারটি ভুল। পাটিগণিত এবং তুলনা অপারেটরদের মধ্যে আচরণটি আলাদা নয়। x + (x = y)এবং (x = y) + xতুলনা অপারেটরগুলির সাথে মূল হিসাবে একই আচরণ দেখায়।
জেজেজে

1
@ জেজেজে x + (x = y) এবং (x = y) + x এর সাথে কোনও তুলনা জড়িত নেই, এটি কেবলমাত্র x এর y মান নির্ধারণ করে এবং এটি x এ যুক্ত করছে।
নিসরিন ধুনদিয়া

1
... হ্যাঁ, এটা মূল বিষয়। "প্যারেন্থিসগুলি কেবল তুলনা প্রকাশে নয় পাটিগণিতের এক্সপ্রেশনগুলিতে এর প্রধান ভূমিকা পালন করে" ভুল কারণ পাটিগণিত এবং তুলনা এক্সপ্রেশনগুলির মধ্যে কোনও পার্থক্য নেই।
জেজেজে

2

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


1
উত্তরটি ভুল। অপারেটর অগ্রাধিকার মূল্যায়ন আদেশ প্রভাবিত করে না। ব্যাখ্যার জন্য শীর্ষ-ভোট প্রাপ্ত কয়েকটি উত্তর পড়ুন, বিশেষত এটি
জেজেজে

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

-1

বাম দিকের দ্বিতীয় তুলনাটি সহজ, আপনি y = x (বাম দিকে) নির্ধারণের পরে অ্যাসাইনমেন্টটি তারপরে 3 == 3 তুলনা করছেন example প্রথম উদাহরণে আপনি x = 1 কে নতুন নির্ধারিত x = 3 এর সাথে তুলনা করছেন বলে মনে হয় that বাম থেকে ডানদিকে ডানদিকে সর্বদা চলমান স্টেট স্টেটিং থাকে।


-2

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

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


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