java - জাভা এসাইনমেন্ট অপারেটর কার্যকর
string equals (6)
আমি আপনার প্রশ্নটি গ্রহনে চেষ্টা করেছি আপনার উভয় অভিব্যক্তিই সঠিক। 1) x == (y = x) এটি সত্য বলে মূল্যায়ন করে কারণ x নির্ধারিত y এর মান যা 'হ্যালো' তারপরে x এবং y এর সাথে তুলনা করে তাই ফলাফলটি সত্য হবে
২) x.equal (x = y) এটি মিথ্যা কারণ y এর মান x নির্ধারিত যা বিদায় হয় তবে x এবং x এর মান তুলনা করে পৃথক হবে ফলে ফলাফল মিথ্যা হবে
জাভাতে, আমি বুঝতে পারি যে অ্যাসাইনমেন্টটি সঠিক অপরেন্ডের মানকে মূল্যায়ন করে, তাই
x == (y = x)
মতো বিবৃতি
true
কাছে মূল্যায়ন করে।
এই কোডটি তবে
false
আউটপুট
false
।
public static void main(String[]args){
String x = "hello";
String y = "goodbye";
System.out.println(x.equals(x = y));
}
কেন?
আমার বুঝে এটি প্রথমে
(x = y)
মূল্যায়ন করে, যা এক্সকে
x
এর মান নির্ধারণ করে এবং তারপরে
y
এর মান প্রদান করে।
তারপরে
x.equals(y)
মূল্যায়ন করা হয়, যা
true
হওয়া উচিত যেহেতু
x
এবং
y
এখন একই তথ্য ভাগ করা উচিত তবে পরিবর্তে আমি
false
যাব।
এখানে কি হচ্ছে?
এটি দেখতে পাচ্ছে যে x.equals (x থেকে y নির্ধারণ করুন, সর্বদা সত্য ফিরে আসে) তাই মূলত x.equals (সত্য)
জাভা ইন স্ট্রিং একটি বর্গ।
String x = "hello";
String y = "goodbye";
একটি দুটি ভিন্ন স্ট্রিং যা দুটি ভিন্ন মানকে বোঝায় যা একই নয় এবং যদি আপনি তুলনা করেন
System.out.println(x.equals(x = y));
//this compare value (hello and goodbye) return true
System.out.println(x == (y = x));
// this compare reference of an object (x and y) return false
প্রথমত: এটি একটি আকর্ষণীয় প্রশ্ন, তবে কখনই "রিয়েল কোড" এ আসা উচিত নয়, আপনি যে একই ভেরিয়েবলটিকে কল করেন ঠিক একই লাইনে কল্পনা বিভ্রান্তিকর হয় যদিও আপনি এটি জানেন যে এটি কীভাবে কাজ করে।
এখানে যা ঘটে তা এই 3 টি পদক্ষেপ:
-
কোন বস্তুকে পদ্ধতিটি কল করতে হবে তা নির্ধারণ করুন (উদাহরণস্বরূপ প্রথম
x
মূল্যায়ন করুন, এর ফলে স্ট্রিং "হ্যালো" এর রেফারেন্স হবে) -
প্যারামিটারগুলি বের করুন (যেমন
x = y
মূল্যায়ন করুন, যা স্ট্রিং "বিদায়" এর প্রতি নির্দেশ করেx
পরিবর্তন করবে এবং সেই স্ট্রিংয়ের একটি রেফারেন্সও ফিরিয়ে দেবে) -
প্যারামিটার হিসাবে # 2 এর ফলাফলকে ব্যবহার করে পদ্ধতিটিকে 1 1 এর
equals
কল করুন (যা স্ট্রিংগুলিকে যথাক্রমে "হ্যালো" এবং "বিদায়" হিসাবে উল্লেখ করা হবে)।
এই পদ্ধতির জন্য উত্পাদিত বাইট কোডটি দেখে এটি পরিষ্কার হয়ে যায় (ধরে নেওয়া যাক আপনি জাভা বাইটকোডে সাবলীল):
0: ldc #2 // String hello
2: astore_1
3: ldc #3 // String goodbye
5: astore_2
6: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
9: aload_1
10: aload_2
11: dup
12: astore_1
13: invokevirtual #5 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
16: invokevirtual #6 // Method java/io/PrintStream.println:(Z)V
19: return
লাইন # 9 উপরের 1 ধাপ (অর্থাত্
x
মূল্যায়ন করে মানটি মনে করে)।
লাইন # 10-12 হল পদক্ষেপ 2 এটি
y
লোড করে, এটি সদৃশ করে (একবার বরাদ্দকরণের জন্য, একবার কার্যপ্রণালী প্রকাশের ফেরতের মূল্যের জন্য) এবং এটি এক্সকে নির্ধারণ করে।
লাইন # 13 লাইন # 9 তে গণনা করা ফলাফল এবং লাইনগুলির ফলাফলের জন্য
equals
হয় # 10-12।
ভাল প্রশ্ন! এবং জেএলএস এর উত্তর আছে ...
§15.12.4.1 (উদাহরণ 15.12.4.1-2)। পদ্ধতি আমন্ত্রণের সময় মূল্যায়ন আদেশ:
একটি উদাহরণ পদ্ধতি আহ্বানের অংশ হিসাবে, একটি অভিব্যক্তি রয়েছে যা অবজেক্টটিকে আহ্বান জানায়। পদ্ধতিটি অনুরোধের জন্য কোনও যুক্তি প্রকাশের কোনও অংশ মূল্যায়ন করার আগে এই অভিব্যক্তিটি সম্পূর্ণ মূল্যায়ন করা বলে মনে হয়।
সুতরাং, এতে:
String x = "hello";
String y = "goodbye";
System.out.println(x.equals(x = y));
x = y
পূর্বে
x
এর উপস্থিতিটি প্রথমে মূল্যায়ন করা হয়, যুক্তি প্রকাশের আগে
x = y
।
সুতরাং, স্ট্রিং
hello
একটি রেফারেন্সটি স্থানীয় ভেরিয়েবল
x
পরিবর্তনের আগে স্ট্রিং
goodbye
লক্ষ্য রেফারেন্স হিসাবে মনে পড়ে।
ফলস্বরূপ,
equals
পদ্ধতিটি আর্গুমেন্ট
goodbye
সহ টার্গেট অবজেক্ট
hello
জন্য অনুরোধ করা হয়, সুতরাং আহ্বানের ফলাফলটি
false
।
রেইমাস সঠিক উত্তরটি দিয়েছিল তবে আমি বিশদভাবে বলতে চাই।
জাভাতে (এবং বেশিরভাগ ভাষায়) কনভেনশনটি চলক হয় বামদিকে, ডানদিকে অ্যাসাইনমেন্ট।
আসুন এটি ভেঙে দিন:
String x = "hello";
//x <- "hello"
String y = "goodbye";
//y <- "goodbye";
ডিবাগিং উদ্দেশ্যে পাশাপাশি কোড পঠনযোগ্যতার জন্য আপনার লাইনগুলি বিভক্ত করা সর্বদা একটি ভাল অনুশীলন যাতে তারা কেবল একটি কাজ করে।
System.out.println(x.equals(x = y)); //Compound statement
এখানে
x.equals(...)
কে x এর মূল রেফারেন্স বা "হ্যালো" বলা হয়, এটি দ্বিতীয় রেফারেন্সের জন্য আপডেট করা হয়।
আমি এটি লিখব (এবং এটি আপনাকে আপনার প্রত্যাশিত উত্তর দেবে):
x = y;
// x <- y = "goodbye"
boolean xEqualsX = x.equals(x);
// xEqualsX <- true
System.out.println(xEqualsX);
// "true"
এখন এটি সুস্পষ্ট বলে মনে হয় যে এটির এইরকম আচরণ করা উচিত তবে প্রতিটি লাইনে ঠিক কী চলছে তা দেখতে এটি খুব সহজ, যা আপনার পক্ষে চেষ্টা করা উচিত।