(I <= j && j <= i&& i! = J) কেন সত্যে মূল্যায়ন করে?


104

আমি জাভা কোডের একটি অংশ লিখেছি যা অসীম লুপে চলছে।

নীচে কোডটি দেওয়া হল:

public class TestProgram {
    public static void main(String[] args){
        Integer i = new Integer(0);
        Integer j = new Integer(0);

        while(i<=j && j<=i && i!=j){
            System.out.println(i);
        }
    }
}

উপরের কোডে, whileলুপের শর্তটি দেখার সময় প্রথমে দেখে মনে হচ্ছে যে প্রোগ্রামটি whileলুপের ভিতরে যাবে না । তবে আসলে এটি একটি অসীম লুপ এবং মানটি মুদ্রণ করে রাখে keeps

এখানে কি হচ্ছে?


8
সহজ উত্তর হ'ল i<=j && j<=i && i!=jএই শর্তটি সর্বদা সত্যের কাছে মূল্যায়ন করে। কেবলমাত্র এক টুকরো কাগজ নিন এবং মূল্যায়ন করুন এটি আপনাকে ধরবে :)
প্রদীপ সিমহা

4
আপনি যেভাবে পূর্ণসংখ্যা তৈরি করছেন তা ভুল। 'তুলনামূলক' ব্যবহার করুন
nachokk

7
আপনি যদি কখনই পরিবর্তন করেন না iবা j, আপনি কখন লুপটি শেষের আশা করবেন?
ফ্রেড লারসন

33
@PradeepSimha সহজ int- এ মান জন্য, এই সবসময় উত্পাদ হবে মিথ্যা । থেকে i<=jএবং j<=iআপনি উপসংহারে আসতে পারেন, এটি i == j, যা শেষ শব্দটির সাথে বিরোধী। সুতরাং সম্পূর্ণ এক্সপ্রেশনটি মিথ্যাতে মূল্যায়ন করে এবং এর মধ্যে প্রবেশ করা হবে না। মূল বিষয় হ'ল এখানে বস্তুর পরিচয়!
সিরকো

4
একদিকে যেমন জাভা পাজলার্স: ট্র্যাপস, পিটফলস এবং কর্নার কেসস বইয়ের 32 ধাঁধাটি এটি।
সায়ানফিশ

উত্তর:


188
  • i <= jথেকে মূল্যায়ন করা হয় true, কারণ স্বয়ং আনবক্সিং int- এ তুলনা ঘটে এবং তারপর উভয় iএবং jডিফল্ট মান রাখা 0

  • j <= itrueউপরোক্ত কারণে মূল্যায়ন করা হয় ।

  • i != jমূল্যায়ন করা হয় true, কারণ উভয় iএবং jপৃথক বস্তু। এবং বস্তুর তুলনা করার সময়, অটো আনবক্সিংয়ের কোনও প্রয়োজন নেই isn't

সমস্ত শর্ত সত্য, এবং আপনি পরিবর্তন করছেন না iএবং jলুপে নেই, তাই এটি অসীমভাবে চলমান।


10
আপনি কি দয়া করে ব্যাখ্যা করতে পারেন, কেন! = রেফারেন্স অবজেক্টগুলির মেমরি সূচকটি পরীক্ষা করছে এবং <= পূর্ণসংখ্যার আন-বক্সিত মানটি পরীক্ষা করছে ?? .. কেন এই অপারেটরের মধ্যে এত পার্থক্য রয়েছে?
পুনিথ রাজ

41
@ পুনিরাজ <&> অপারেটরগুলি আদিমগুলিতে কাজ করে, বস্তুগুলিতে নয়, সুতরাং এই অপারেটরগুলির জন্য অটো আনবক্সিং হয়। তবে == এবং! = অপারেটরগুলি অবজেক্টের তুলনার জন্যও ব্যবহার করা যায় তাই এখানে আনবক্সিংয়ের প্রয়োজন নেই, সুতরাং বস্তুর তুলনা করা হয়।
জুনেদ আহসান

14
আহ, অন্তর্নিহিত বক্সিং / আনবক্সিংয়ের লুকানো বিপদ !!
হট লিকস

3
স্ট্যাক ওভারফ্লোতে কেবল একটি নতুন ট্যাগ যুক্ত করা উচিত, "জাভাতে অটো-আনবক্সিং এখন পর্যন্ত সবচেয়ে বড় ভুল ছিল"। :-)। জাভা পাজলারের বইয়ের লেখক ব্যতীত। এই জাতীয় প্রশ্ন ট্যাগ করতে এটি ব্যবহার করুন।
user949300

4
দয়া করে মনে রাখবেন Integer.valueOf(0) == Integer.valueOf(0)সবসময় সত্যতে মূল্যায়ন করা হয়, কারণ এই ক্ষেত্রে একই বস্তুর ফিরিয়ে দেওয়া হয় (IntegerCache দেখতে grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/... )
Vitalii Fedorenko

40

কারণ আপনি তুলনা করছেন

  • 0 < = 0 (true) // unboxing

  • 0 > = 0 (true) // unboxing

  • reference != secondReference (true)আপনি যেমন কোনও বস্তু তৈরি করছেন তা কোনও আদিম তুলনা নয়। সুতরাং এটি মূল্যায়ন while(true) { // Never ending loop }


2
ওহ! স্বতঃ লুকানো ড্রাগন ইউএনবক্সিং ... ভাল ব্যাখ্যা।
হাইব্রিহেল্প

17

পূর্ণসংখ্যার বস্তুগুলি পৃথক। এটি বেসিক int টাইপ থেকে পৃথক।

এই উত্তরটি দেখুন: জাভাতে দুটি পূর্ণসংখ্যার সঠিকভাবে তুলনা কীভাবে?

i != jঅংশ সত্য যা আপনি মিথ্যা হতে পারে আশা করছিলেন।


সত্য হলেও এটি এখানে কোনও বিষয় নয় বা এটি প্রশ্নের উত্তর দেয় না।
কন

6
@ কন: আসলে এটিই উত্তর। # 1 এবং # 2 শর্তগুলি trueঅটোবক্সিংয়ের কারণে মূল্যায়ন করে । # 3 ক্ষেত্রে অটোবক্সিং প্রযোজ্য নয় এবং তুলনাটি বস্তুর (মেমরি অবস্থান) স্তরে স্থান নেয়।
বাড়ি

1

লুপটি শেষ হচ্ছে না কারণ আপনার শর্তটি সত্য (i! = J সত্য কারণ 2 টি পৃথক বস্তু রয়েছে, পরিবর্তে পূর্ণসংখ্যা ব্যবহার করুন val মান মান দিন) এবং লুপের অভ্যন্তরে মানগুলি পরিবর্তন হয় না তাই আপনার অবস্থা চিরকাল স্থায়ী থাকে।


1

পূর্ণসংখ্যার বস্তুগুলি পৃথক। এটি বেসিক int টাইপ থেকে পৃথক। সুতরাং আপনি ঠিক এটি করতে পারেন। আপনি যা করেন এটি কেবলমাত্র বস্তুর সাথে তুলনা করুন এবং অবশ্যই ফলাফলটি সত্য।


1

এখানে দুটি ভিন্ন মামলা রয়েছে যা আমাদের প্রথমে বুঝতে হবে,

মামলা 1:

        Integer i = new Integer(10);
        Integer j = new Integer(10);

        System.out.println((i<=j && j<=i && i!=j));
        System.out.println(i!=j);

কেস 2:

        Integer i = 10;
        Integer j = 10;

        System.out.println((i<=j && j<=i && i==j));
        System.out.println(i==j);

উভয় পৃথক, হিসাবে

কেস 1: i!=jহতে হবে trueকারণ তাদের উভয়ই গাদা মধ্যে দুটি ভিন্ন বস্তু উল্লেখ এবং একই হতে পারে না। কিন্তু

কেস 2: i==jহতে হবে trueকারণ তাদের উভয়ই 10 পূর্ণসংখ্যা লিটারেল এবং জাভা বজায় রাখে pool for Integer literalsযা মূল্য আছে (-128 <= X <= 127)। সুতরাং, এই ক্ষেত্রে 10 <= 127 ফলাফল সত্য, সুতরাং উভয়ের একই অবজেক্টের রেফারেন্স থাকবে।


0

সম্ভবত কারণটি হ'ল 'আমি' এবং 'জ' উভয়ই বস্তু এবং বস্তুর তুলনা বস্তুর রেফারেন্স তুলনা হিসাবে একই নয়। দয়া করে আমি! = J এর পরিবর্তে! I.equals (j) ব্যবহার বিবেচনা করুন


0

প্রোগ্রামের একই মান প্রদর্শন করার উপর রাখে iকারণ আপনার বৃদ্ধিশীল বা decrementing পারেন এর মান নেই iবা j। এর মধ্যে অবস্থিতি সর্বদা সত্যের দিকে মূল্যায়ন করে চলেছে, তাই এটি অসীম লুপ।


আমি মনে করি যে প্রশ্নটি সেই i!=jঅংশটি সম্পর্কে আরও ছিল যা আশ্চর্যরূপে সত্যের সাথে মূল্যায়ন করে <=তুলনা করে না ।
সোরাভাক্স

0

পূর্ণসংখ্যা a = নতুন পূর্ণসংখ্যা (0); পূর্ণসংখ্যা খ = নতুন পূর্ণসংখ্যা (0);

<= এবং> = তুলনাগুলি আনবক্স করা মান 0 ব্যবহার করবে, যখন! = উল্লেখগুলি তুলনা করবে এবং তারা ভিন্ন ভিন্ন বস্তু হওয়ায় সফল হবে।

এমনকি এটি কাজ করেও i, e

পূর্ণসংখ্যা a = 1000; পূর্ণসংখ্যা খ = 1000;

কিন্তু এটি না:

পূর্ণসংখ্যা a = 100; পূর্ণসংখ্যা খ = 100;

কারণ হ'ল ইন্টিজার অভ্যন্তরীণভাবে -128 এবং 127 এর মধ্যে পূর্ণসংখ্যার অবজেক্টগুলির জন্য ক্যাচিং ব্যবহার করে এবং সেই ক্যাশে থেকে আচ্ছাদিত পরিসীমাটির জন্য দৃষ্টান্তগুলি ফিরে আসে। আমি নিশ্চিত নই তবে আমার ধারণা আপনি প্যাকেজ "java.lang.Integer.IntegerCache.high" এর সর্বোচ্চ মানটিও পরিবর্তন করতে পারবেন।

আরও ভাল করে বোঝার জন্য ইউআরএল: https://www.owasp.org/index.php/ জাভা_গোটচস # আইম্যাটেবল_অবজেক্ট_২ এফএফ_আপনার_ক্লাস_চক্র


-3

আপনাকে এটিকে && এর মধ্যে কিছুটা আলাদা জানতে হবে এবং আপনি যখন && ব্যবহার করেন এবং তারপরে যখন প্রথম শর্তটি সত্য হয় তখন এটি দ্বিতীয় শর্তটি মিথ্যা কিনা তা পরীক্ষা করে যদি এটি তৃতীয় শর্তটি পরীক্ষা করে না কারণ একটি শর্ত যদি সমস্ত মিথ্যা হয় তবে বিবৃতি মিথ্যা যদি ব্যবহার হয় || তবে যদি এটি সত্য দেখা যায় তবে এটি আপনার কোডে সত্য ফিরে আসে কারণ আমি এবং জে প্রথম এবং দ্বিতীয় শর্তটি সমান হয় তৃতীয় শর্তে এটি মিথ্যা হবে কারণ তারা সমান এবং শর্তটি মিথ্যা।


কেন আমি আমার উত্তর খনি মান পেতে কারণ আমার উত্তর সত্য এই লিঙ্কটি দেখতে জানি না তার সত্যিকারের তারপর সামনে আমার উত্তর খনি পড়া পেতে পারেন, আরো stackoverflow.com/questions/5564410/difference-between-and
সারা Sodagari
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.