একটি জাভা ভেরিয়েবল কীভাবে নিজের থেকে আলাদা হতে পারে?


106

আমি ভাবছি এই প্রশ্নটি জাভাতে সমাধান করা যায় (আমি ভাষাতে নতুন)। এই কোড:

class Condition {
    // you can change in the main
    public static void main(String[] args) { 
        int x = 0;
        if (x == x) {
            System.out.println("Ok");
        } else {
            System.out.println("Not ok");
        }
    }
}

আমি আমার ল্যাবটিতে নিম্নলিখিত প্রশ্ন পেয়েছি: x == xশর্তটি নিজেরাই পরিবর্তন না করে আপনি কীভাবে প্রথম কেসটি (অর্থাত্ শর্তটিকে মিথ্যা বানাবেন) এড়িয়ে যেতে পারেন ?


12
আমি বিশ্বাস করি আরও বাধা থাকা উচিত, অন্যথায় এটি খুব বেশি উন্মুক্ত।
ফার্মেটের ছোট্ট ছাত্র

52
System.out.println("Gotcha!");মন্তব্য করার পরিবর্তে এটি কি এত সহজ ? :)
stuXnet

7
ভাল, তারপরে দ্বিগুণ = ডাবল। স্বল্পতম উত্তর এবং আমার "হ্যাকটি কেবল একটি প্রতারণা;)
খ্রিস্টান কুয়েটবাচ

47
এটি সুন্দর জাভা ট্রিভিয়া, তবে আমি আশা করি কেউ এটিকে একটি সাক্ষাত্কারের প্রশ্ন হিসাবে বিবেচনা করবেন না। প্রার্থীদের কর্মসংস্থানের জন্য বিবেচনা করা লোকেরা প্রোগ্রামিং বুঝতে পারে কিনা তা জানার জন্য তাদের যথাসাধ্য চেষ্টা করা উচিত, না তিনি কতটা ট্রিভিয়া জমা করেছেন তা। আমি জাভাতে ১ programming বছরের প্রোগ্রামিংয়ে সবেমাত্র ভাসমান পয়েন্ট সংখ্যা ব্যবহার করেছি, এনএএন কমপ্লিট কম, এটি == অপারেটরের সাথে কী আচরণ করে তা খুব কম জানা ...
আরসি

8
@ ব্যবহারকারী1158692 মতামতের বিষয়টি, আমি ব্যক্তিগতভাবে যে কোনও প্রোগ্রামকে ঘৃণা করি যেখানে বেসিক অপারেটরগুলি অগ্রাহ্য করা হয়েছে এবং আমি খুশী যে জাভাতে আমি যে কোড পেয়েছি তাতে ভুল হয় নি (আমি * ভেক্টর ক্রস প্রোডাক্ট এবং ডট পণ্য হিসাবে ওভাররাইড দেখেছি কারণ) উভয়ই ভেক্টর গুণ এবং ধীরে ধীরে! জাভাতে একজনকে ডাকা হয় .cross()এবং অন্যটি হয় .dot()এবং এতে কোনও বিভ্রান্তি হয় না। এছাড়াও "== অপারেটরকে ওভাররাইড করে সর্বদা মিথ্যা ফিরিয়ে দেয়" এই বিষয়টি প্রকৃত জাভা হিসাবে দেখা যায় না
রিচার্ড টিংল

উত্তর:


172

একটি সহজ উপায় হ'ল ব্যবহার করা Float.NaN:

float x = Float.NaN;  // <--

if (x == x) {
    System.out.println("Ok");
} else {
    System.out.println("Not ok");
}
ঠিক নাই

আপনি একই সঙ্গে করতে পারেন Double.NaN


জেএলএস==!= থেকে .215.21.1। সংখ্যাগত সাম্য অপারেটর এবং :

আইইইই 754 স্ট্যান্ডার্ডের বিধি অনুসারে ভাসমান-পয়েন্ট সমতা পরীক্ষা করা হয়:

  • যদি পারেন প্রতীক নান তত্কালীন ফল ==হয় falseকিন্তু ফল !=হয় true

    বস্তুত, পরীক্ষা x!=xহয় trueযদি এবং কেবল যদি এর মান xNaN হয়।

...


157
int x = 0;
if (x == x) {
    System.out.println("Not ok");
} else {
    System.out.println("Ok");
}

63
হেই, এটি সম্পূর্ণরূপে জিজ্ঞাসিত প্রশ্নের উত্তর দেয়।
ডেভ নিউটন

5
@ অ্যাসউইন মুরগেশ রাইট, তবে আমরা যদি এই উত্তরটির মতো করে প্রশ্নটি সম্পূর্ণ আক্ষরিক অর্থে নিই, তবে আমরা elseপুরোপুরি মুছতে পারি । এটি প্রযুক্তিগতভাবে প্রশ্নের শর্তাদি লঙ্ঘন করবে না।
আরশাজী

67
এটি আমার দ্বিতীয় সর্বোচ্চ ভোট দেওয়া উত্তর বিবেচনা করে আমি নিশ্চিত যে আমি খুব মজাদার বা ক্রেপি প্রোগ্রামার হিসাবে এই সিদ্ধান্তে পৌঁছাতে চাই কিনা not
জেরোইন ভেনেভেল

5
@ জিরোভানভেনিল প্রয়োজনীয়তাগুলি মনে করে, আমি মনে করি এটি সর্বাধিক কেআইএসএস / ইয়াজিএনআই / উপযুক্ত উত্তর;)
ইজকাটা

12
@ জেদ্দসন্তান্তেলা: স্পষ্টতই এটি পরে সম্পাদিত হয়েছিল। মূল প্রশ্নটি বলেছিল "আমি কীভাবে 'ঠিক নেই' মুদ্রণ করতে পারি"।
জেরোইন ভেনেভেল

147

দ্বারা জাভা ভাষা উল্লেখ NaN সমান নয় NaN

সুতরাং যে কোনও রেখা xসমান হতে NaNপারে এর কারণ হতে পারে

double x=Math.sqrt(-1);

জাভা ভাষার বিশেষ উল্লেখ থেকে:

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


@ sᴜʀᴇsʜᴀᴛᴛᴀ একটি সুস্পষ্ট বক্তব্য, আমি "কোডিং কনভেনশন" বলতে গিয়ে এতটাই ব্যস্ত ছিলাম যে আমি আসলে প্রশ্নের উত্তর দিতে ভুলে গেছি
রিচার্ড টিঙ্গল

এটি কেবলমাত্র বৈধ যদি কোনও অবজেক্ট বা ডাবল হিসাবে ঘোষিত হয়।
খ্রিস্টান কুয়েটবাচ

1
@ ক্রিশ্চিয়ান কুয়েটবাচ সত্য, বিপরীত কোনও তথ্যের অভাবে আমি ধরে নিয়েছি মন্তব্য করা লাইনটি যে কোনও কিছু হতে পারে
রিচার্ড টিঙ্গল

2
এমনকি আমার প্রতারিত উত্তর সঠিক এবং নিয়মগুলি পূরণ করে। আমি কেবল-ই-স্টেটমেন্টের আগে সম্পাদনা করেছি এবং কেবল "গোটচা! মুদ্রিত হয়েছে I'আমি নিশ্চিত, এই উত্তরটি এই ধাঁধার সৃষ্টিকর্তার মনে উত্তর নয় But তবে ধাঁধাটি ভালভাবে সংজ্ঞায়িত হয়নি (বেশিরভাগ সফ্টওয়্যারপ্রজেক্ট হিসাবে )।
খ্রিস্টান কুয়েটবাচ

73

নিশ্চিত না যে এটি বিকল্প কিনা তবে xস্থানীয় ভেরিয়েবল থেকে একটি ক্ষেত্রের পরিবর্তনে অন্য থ্রেডকে ifস্টেটমেন্টে বাম এবং ডান পাশের পাঠের মধ্যে এর মান পরিবর্তন করতে দেওয়া হবে ।

এখানে সংক্ষিপ্ত ডেমো:

class Test {

    static int x = 0;

    public static void main(String[] args) throws Exception {

        Thread t = new Thread(new Change());
        t.setDaemon(true);
        t.start();

        while (true) {
            if (x == x) {
                System.out.println("Ok");
            } else {
                System.out.println("Not ok");
                break;
            }
        }
    }
}

class Change implements Runnable {
    public void run() {
        while (true)
            Test.x++;
    }
}

আউটপুট:

⋮
Ok
Ok
Ok
Ok
Ok
Ok
Ok
Ok
Not ok

8
হাহা +1 প্রয়াসের জন্য, তবে মানুষ ... আমার জাভা ল্যাবটিতে কেউ এরকম কিছু নিয়ে আসবেন না (প্রশিক্ষক অন্তর্ভুক্ত)।
উইলিয়াম গল

28
@ উইলিয়ামগল সত্যই? আমি সর্বদা যদিও এটি বহুবিধ পড়ার ক্ষেত্রে সম্ভাব্য সমস্যাগুলি দেখানো এমন একটি মৌলিক উদাহরণ এবং কেন যারা এই বিষয়টিকে সহজ বলে মনে করেন তাদের কখনই কোনও কিছুর দায়িত্বে থাকা উচিত নয় :)
প্লেমো

4
আমি আপনার উত্তরটি না পড়া পর্যন্ত আমি এই সমস্যাটি নিয়ে ভাবিনি। আমার মানসিক টুলকিট করার :) এই যোগ করার জন্য আপনাকে ধন্যবাদ
Behe

56

প্রতিস্থাপন লাইন পড়তে পারে।

double x = Double.NaN;

এর ফলে গোটচা মুদ্রিত হবে।

জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন (জেএলএস) বলেছেন:

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


অথবা একটি সংকলন ত্রুটির দিকে পরিচালিত করুন, যদি স্ট্রিং এ = "নাপ" হিসাবে ঘোষণা করা হয়; এজন্য আমি 'এ' ধরণের জন্য জিজ্ঞাসা করেছি
খ্রিস্টান কুয়েটবাচ

উপরের কোডটি প্রকার সম্পর্কে কোনও তথ্য দেয় না, তাই আমি ধারণাটি তৈরি করেছি যে একটি ইতিমধ্যে সংজ্ঞায়িত নয়।
ম্যাক্স

আমি মনে করি যে আপনার উত্তরটি উত্তর, এটি ধাঁধা সৃষ্টিকর্তার মনে। তবে বিধি পরিষ্কার ছিল না। দুটি মাত্র বিধি দেওয়া হয়েছিল: ১. মন্তব্যটির সাথে কেবল লাইনটি সন্নিবেশ করুন এবং ২ টি মাত্র একটি "
গোছা

ধাঁধা লেখক কোডটি ঘিরে}}
মেক্স

30

আমি এটি Gotcha!থেকে একটি পেতে পরিচালিত :

volatile Object a = new Object();

class Flipper implements Runnable {
  Object b = new Object();

  public void run() {
    while (true)  {
      Object olda = a;
      a = b;
      a = olda;
    }
  }

}

public void test() {
  new Thread(new Flipper()).start();

  boolean gotcha = false;
  while (!gotcha) {
    // I've added everything above this - I would therefore say still legal.
    if (a == a) {
      System.out.println("Not yet...");
    } else {
      System.out.println("Gotcha!");
      // Uncomment this line when testing or you'll never terminate.
      //gotcha = true;
    }
  }
}

1
এটি প্রশ্ন হিসাবে জিজ্ঞাসা মতামত চেয়ে বেশি পরিবর্তন।
ম্যাক্স

আমি এরকম কিছু চেষ্টা করেছি কিন্তু আমি মনে করি যে এটির নিশ্চয়তা রয়েছে যে এটি সর্বদা একই ফল প্রকাশ করবে, তাই না?
AndreDurao

4
@ মেক্স - এটি সত্যই রয়েছে তবে এটি আরও মূল বিষয়টি প্রদর্শনের জন্য মূলটির যথেষ্ট পরিমাণে সংরক্ষণ করে যে কখনও কখনও a != aএটি অন্য থ্রেড দ্বারা পরিবর্তিত হয়েছিল। আমি সন্দেহ করি এটি একটি সাক্ষাত্কারে পয়েন্ট জিতবে।
ওল্ড কার্মিউডজিয়ন

এটি আসলে বেশ চালাক, যদিও আমি ধরে নিলাম যে এটি "আশা" দ্বারা কাজ করে aযা তুলনা করার জন্য প্রথম এবং দ্বিতীয় অ্যাক্সেসের মধ্যে প্রথম থ্রেড দ্বারা পরিবর্তিত হয়
রিচার্ড টিংল

4
আপনার সন্দেহকারীদের পুনরায়; এটি লক্ষ্য করার মতো বিষয় যে আপনি মূল ifবক্তব্যটির উপরে যা লিখেছেন তা যদি প্রয়োজন হয় তবে একক ভয়াবহ লাইনে লেখা যেতে পারে
রিচার্ড টিংল

25

অনেকগুলি সমাধান রয়েছে:

class A extends PrintStream {
    public A(PrintStream x) {super(x);}
    public void println(String x) {super.println("Not ok");}
    public static void main(String[] args) {
        System.setOut(new A(System.out));
        int x = 0;
        if (x == x) {
            System.out.println("Ok");
        } else {
            System.out.println("Not ok");
        }
    }
}

1
আমি যদি কিছু মিস করছি না, তবে এটি super.println"ঠিক আছে" হওয়া উচিত, তাই না?
ইজকাটা

@ ইজকাটা হ্যাঁ, পছন্দসই ফলাফলটি কী হবে তা যাচাই করে নি।
জোহানেস কুহন

2
একদম অসাধারণ!
দারিউজ

25

একটি সহজ সমাধান হ'ল:

System.out.println("Gotcha!");if(false)
if( a == a ){
  System.out.println("Not yet...");
} else {
  System.out.println("Gotcha!");
}

তবে আমি এই ধাঁধার সমস্ত নিয়ম জানি না ...

:) আমি জানি যে এটি একটি প্রতারণা, তবে সমস্ত বিধিবিধান না জেনেও কি এই প্রশ্নের সহজ সমাধান :)


1
এক লাইনে লেখা যেতে পারে;)
খ্রিস্টান কুয়েটবাচ

6
@ ক্রিশ্চিয়ান কিউটবাচ সমস্ত প্রোগ্রাম হিসাবে পারেন
রিচার্ড টিঙ্গল

2
@ খ্রিস্টিয়ানকুয়েচবাচ সমস্ত ন্যায্যতার সাথে সংকলকটি অবশ্যই আপনার কম্পিউটারের সমস্ত ফাইল মুছে ফেলা উচিত যদি আপনি আসলে এর মতো প্রোগ্রাম করার চেষ্টা করেন
রিচার্ড টিংল

1
এত কঠিন কেন? if (System.out.println("Gotcha") && false)
অ্যালেক্সিস

3
ত্রুটি: এখানে 'শূন্য' প্রকারের অনুমতি নেই তবে (
সিস্টেম.out.println

11

Systemএকই প্যাকেজের সাথে নিজের ক্লাস তৈরি করুন Condition
এই ক্ষেত্রে আপনার Systemবর্গ লুকাবো java.lang.Systemবর্গ

class Condition
{
    static class System
    {
        static class out
        {
            static void println(String ignored)
            {
                java.lang.System.out.println("Not ok");
            }
        }
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        int x = 0;
        if (x == x) 
        {
           System.out.println("Not ok");
        } 
        else 
        {
           System.out.println("Ok");
        }
    }
}  

আইডিয়ন ডেমো


9

অন্য উত্তর থেকে একই স্কিপ / পরিবর্তন আউটপুট পদ্ধতির ব্যবহার:

class Condition {
    public static void main(String[] args) {
        try {
            int x = 1 / 0;
            if (x == x) {
                System.out.println("Ok");
            } else {
                System.out.println("Not ok");
            }
        } catch (Exception e) {
            System.out.println("Not ok");
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.