কেন জাভা যদি সংখ্যার শর্তসাপেক্ষে (5) {… C সিটি করে তবে মঞ্জুরি দেয় না?


33

আমার এই দুটি ছোট প্রোগ্রাম রয়েছে:

সি

#include <stdio.h>
int main()
{
    if (5) {
        printf("true\n");
    }
    else {
        printf("false\n");
    }

    return 0;
}

জাভা

class type_system {
   public static void main(String args[]) {
       if (5) {
           System.out.println("true");
       }
       else {
           System.out.println("false");
       }
   }
}

যা ত্রুটি বার্তার রিপোর্ট করে:

type_system.java:4: error: incompatible types: int cannot be converted to boolean
       if (5) {
           ^
1 error

আমার বোঝাপড়া

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

সুতরাং, আমার প্রশ্ন: আমি কোথায় জিনিস ভুল বুঝেছি?

আমি যা খুঁজছি না

আমার প্রশ্নটি খারাপ কোডিং শৈলীর সাথে সম্পর্কিত নয়। আমি জানি এটি খারাপ, তবে আমি কেন আগ্রহী যে সি এটির অনুমতি দেয় না এবং জাভা কেন দেয় না। অতএব, আমি ভাষার টাইপ সিস্টেমে আগ্রহী, বিশেষত এর দৃ in়তা।


22
@ গুগল: জাভাতে টাইপ সিস্টেমটি সম্পর্কে আপনি কী বিশেষভাবে জানতে চান তা কী? টাইপ সিস্টেমটি এটি অনুমতি দেয় না কারণ ভাষার স্পেসিফিকেশন এটি নিষিদ্ধ করে। যে কারণে সি এটি অনুমতি দেয় এবং জাভা উভয় ভাষায় গ্রহণযোগ্য বলে বিবেচিত তার সাথে কিছুই করার থাকে না। টাইপ ব্যবস্থা ফলে আচরণ প্রভাব যে, না কারণ।
রবার্ট হার্ভে

8
@ গুগল: আপনি কেন কিছু ভুল বোঝেন বলে মনে করেন? পাঠ্যটি আবার পড়ছি, আপনার প্রশ্নটি কী তা আমি বুঝতে পারি না।
ডক ব্রাউন

26
প্রকৃতপক্ষে, এটি সি-তে দুর্বল টাইপের উদাহরণ নয় , অতীতে (সি 98) সি-তে এমনকি বুলিয়ান টাইপও ছিল না, সুতরাং সমস্ত "বুলিয়ান" অপারেশনগুলি প্রকৃতপক্ষে intমানগুলির উপর পরিচালিত হয় । আরও সঠিক উদাহরণ হবে if (pointer)
রাফলেউইন্ড

5
আমি হ্রাস পেয়েছি কারণ এটিকে বোঝার চেষ্টা করে খুব বেশি গবেষণা করা হয়েছিল বলে মনে হচ্ছে না।
jpmc26

11
দেখে মনে হচ্ছে যে জিজ্ঞাসিত মূল প্রশ্নটি সম্পাদিত সংস্করণটির চেয়ে কিছুটা আলাদা (এজন্য কিছু মন্তব্য এবং উত্তর একটি পৃথক প্রশ্নের উত্তর দিচ্ছে বলে মনে হচ্ছে)। এর বর্তমান ফর্মে, এখানে কোনও প্রশ্ন বলে মনে হয় না। কি ভুল বুঝাবুঝি? জাভা ঠিক আপনার মত হওয়া উচিত বলে আচরণ করছে।
জেমসডলিন

উত্তর:


134

1. সি এবং জাভা বিভিন্ন ভাষা

তারা যে আলাদাভাবে আচরণ করে তা ভয়াবহ অবাক হওয়ার মতো বিষয় নয়।

2. C থেকে কোন রূপান্তর করছেন না intকরারbool

এটা কিভাবে পারে? boolরূপান্তর করার জন্য সিতেও সত্যিকারের ধরণ ছিল না 1999 পর্যন্ত না । সি ১৯ 1970০ এর দশকের গোড়ার দিকে তৈরি হয়েছিল এবং ifএটি সি এর আগেও এটির অংশ ছিল, যখন এটি বি 1- তে কেবল পরিবর্তনগুলির একটি সিরিজ ছিল

if কেবল একটি ছিল না NOPপ্রায় 30 বছর ধরে সি । এটি সরাসরি সংখ্যার মানগুলিতে অভিনয় করে। সি স্ট্যান্ডার্ড ( পিডিএফ লিঙ্ক ) এর শব্দকোষ , এমনকি boolসি থেকে এস প্রবর্তনের এক দশক পরেও এখনও এর আচরণ নির্দিষ্ট করেif?: "অসম থেকে 0" এবং "সমান 0" পদটি ব্যবহার করে (পি 148) এবং (পি 100) "বুলিয়ান শর্তগুলির চেয়ে" সত্য "বা" মিথ্যা "বা অনুরূপ কিছু।

সুবিধাজনকভাবে, ...

৩. ... সংখ্যাগুলি কেবল প্রসেসরের নির্দেশাবলী যা চালিত হয় সেভাবে ঘটে be

JZএবং JNZশর্তাধীন শাখার জন্য আপনার বেসিক x86 সমাবেশের নির্দেশাবলী instructions বর্ণমালা "হয় জে UMP যদি জেড ERO" এবং " জে UMP যদি এন OT জেড ERO"। পিডিপি -11 এর সমপরিমাণ, যেখানে সিটির উৎপত্তি হয়েছিল, BEQ(" বি কিউন যদি EQ ual হয়") এবং BNE(" বি রানচ যদি এন ওটি কোওল" হয়)।

পূর্ববর্তী ক্রিয়াকলাপটি শূন্য হয়েছে কি না এবং সেই অনুসারে ঝাঁপ দাও (বা না) এই নির্দেশাবলী পরীক্ষা করে।

৪. সি এর তুলনায় জাভা সুরক্ষার চেয়ে অনেক বেশি জোর দেয় 2

এবং, সুরক্ষার কথা মাথায় রেখে তারা সিদ্ধান্ত নিয়েছে যে এর উপর সীমাবদ্ধ ifরাখা booleanব্যয়যোগ্য (এই জাতীয় সীমাবদ্ধতা এবং ফলাফলের সুযোগগুলি ব্যয় কার্যকর করার উভয়ই)।


1. বি এমনকি সব ধরণের আছে না। অ্যাসেম্বলির ভাষাগুলি সাধারণত হয় না। তবুও বি এবং অ্যাসেম্বলি ভাষাগুলি শাখা প্রশাখাকে ঠিকঠাক পরিচালনা করে।

) ড ( ডানিস রিচি ) -এর কথায়, যখন বি-তে সি (জোর দেওয়া খনি) হয়ে পরিকল্পিত পরিবর্তনগুলি বর্ণনা করছিল :

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


13
প্রসেসরের নির্দেশাবলীতে সরাসরি সি ম্যাপিংয়ে বুলিয়ান এক্সপ্রেশন সম্পর্কে ভাল পয়েন্ট। আমি এর আগে ভেবে দেখিনি।
রবার্ট হার্ভে

17
আমি মনে করি পয়েন্ট 4 টি বিভ্রান্তিমূলক বলে মনে হচ্ছে যে সি এর সুরক্ষা ফোকাসের কিছু স্মিডজেন রয়েছে ... সি আপনাকে প্রাথমিকভাবে যা কিছু করতে চান তা করতে দেবে: সি অনুমান করে যে আপনি কী করছেন তা প্রায়শই দর্শনীয়ভাবে বিপর্যয়কর ফলাফলের জন্য।
টেম্পোরাল

13
@ টেম্পোরাল ওল্ফ আপনি বলেছেন যে সি যেন আপনাকে যা করতে দেয় তা খারাপ ছিল। আমার মতে পার্থক্যটি হ'ল সি প্রোগ্রামারদের জন্য লেখা হয়েছিল এবং একটি প্রাথমিক দক্ষতা আশা করা যায়। জাভা কোড বানরদের জন্য লেখা এবং আপনি টাইপ করতে পারলে এতে প্রোগ্রাম করতে পারেন program প্রায়শই দর্শনীয়ভাবে খারাপ তবে কে ঠিক যত্ন করে? আমি কখনই ভুলে যাব না যখন প্রবর্তক জাভা ক্লাসের একজন শিক্ষক আমাকে আমার সিএস নাবালকের অংশ হিসাবে নিতে বাধ্য করেছিলেন, উল্লেখ করেছিলেন যে ফিবোনাসির সংখ্যাগুলি গণনা করার জন্য পুনরাবৃত্তি ব্যবহার করা কার্যকর হতে পারে কারণ এটি "লেখা সহজ" ছিল। সে কারণেই আমাদের কাছে সফটওয়্যার রয়েছে।
ডিআরএফ 12'17

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

11
@ ডিআরএফ শীর্ষ নাম সংস্থাগুলি দ্বারা বিকাশিত মূলধারার সফটওয়্যারগুলিতে বাফার ওভারফ্লো শোষণের প্রবণতা দেখে, সম্ভবত প্রাথমিক দক্ষতার সাথে প্রোগ্রামারদেরও তাদের পা ছোঁড়াতে বিশ্বাস করা যায় না।
মনিকা পুনরায়

14

সি 2011 অনলাইন খসড়া

8.৮.৪.১ ifস্টেটমেন্টটি

সীমাবদ্ধ করে রাখে

1 একটি ifবিবৃতিটির নিয়ন্ত্রণকারী প্রকাশের ক্ষেত্রে স্কেলার প্রকার থাকবে।

শব্দার্থবিজ্ঞান

2 উভয় ফর্মে, প্রকাশটি অসমকে 0 এর সাথে তুলনা করলে প্রথম সাবস্টেটমেন্ট কার্যকর করা হয়else ফর্মের মধ্যে, এক্সপ্রেশনটি 0 এর সমান তুলনা করলে দ্বিতীয় সাবস্টেটমেন্ট কার্যকর করা হয় যদি প্রথম সাবস্টেটমেন্টটি একটি লেবেলের মাধ্যমে পৌঁছানো হয় তবে দ্বিতীয় সাবস্টেটমেন্টটি হবে কার্যকর করা হয়নি

3 আনelse লেটিক্যালি নিকটতম পূর্ববর্তী সাথে যুক্ত করা হয় যদি সিনট্যাক্সের দ্বারা অনুমোদিত হয়।

নোট করুন যে এই ধারাটি কেবলমাত্র নির্দিষ্ট করে যে নিয়ন্ত্রণকারী এক্সপ্রেশনটি একটি স্কেলার প্রকার ( char/ short/int /long / ইত্যাদি) থাকতে হবে, বিশেষত কোনও বুলিয়ান টাইপ নয়। নিয়ন্ত্রণকারী এক্সপ্রেশনটির একটি শূন্য-মান না থাকলে একটি শাখা কার্যকর করা হয়।

এর সাথে তুলনা করুন

জাভা এসই 8 ভাষা স্পেসিফিকেশন

14.9 ifবিবৃতি বক্তব্য বিবৃতির শর্তসাপেক্ষ মৃত্যুদন্ড বা দুই বিবৃতি একটি শর্তাধীন পছন্দ, এক নির্বাহ বা অন্যান্য তবে দুটো একসাথে পারেন।

if
    ইফটেনস্টেটমেন্ট :
        if ( এক্সপ্রেশন ) বিবৃতি

    ইফথনেস স্টেটমেন্ট :
        যদি ( এক্সপ্রেশন ) বিবৃতি নন- শর্টআর অন্য বিবৃতি

    IfThenElseStatementNoShortIf :
        যদি ( এক্সপ্রেশন ) বিবৃতিটি নোটশ ोर्टটি অন্যথায় বিবৃতি ননশোর্টআইফ থাকে
এক্সপ্রেশন প্রকার থাকা আবশ্যক booleanঅথবা Boolean, অথবা একটি কম্পাইল-টাইম এরর দেখা দেয়।

জাভা, OTOH, বিশেষত প্রয়োজন যে একটি ifবিবৃতিতে নিয়ন্ত্রণকারী এক্সপ্রেশন একটি বুলিয়ান টাইপ করা উচিত।

সুতরাং, এটি দুর্বল বনাম শক্তিশালী টাইপিং সম্পর্কে নয়, এটি প্রতিটি স্বতন্ত্র ভাষার সংজ্ঞাটি বৈধ নিয়ন্ত্রণের এক্সপ্রেশন হিসাবে নির্দিষ্ট করে about

সম্পাদন করা

হিসাবে কেন ভাষায় এই বিশেষ সম্মান, বেশ কিছু পয়েন্ট বিভিন্ন আছেন:

  1. সিটি বি থেকে উদ্ভূত, যা একটি "টাইপলেস" ভাষা ছিল - মূলত, সবকিছু ছিল একটি 32- থেকে 36-বিট শব্দ (হার্ডওয়্যারের উপর নির্ভর করে), এবং সমস্ত পাটিগণিত ক্রিয়াকলাপগুলি পূর্ণসংখ্যার ক্রিয়া ছিল। সি টাইপ সিস্টেমটি একবারে কিছুটা বোল্ট হয়েছিল, যেমন ...

  2. ভাষার 1999 এর সংস্করণ অবধি সি এর আলাদা বুলিয়ান ধরণ ছিল না। সি কেবল প্রতিনিধিত্ব করতে শূন্য falseএবং উপ-শূন্যকে উপস্থাপনের জন্য বি কনভেনশন অনুসরণ করেছিল true

  3. জাভা পরবর্তী কয়েক দশক ধরে সি পোস্ট-ডেট করে এবং এটি সি এবং সি ++ এর কিছু ত্রুটিগুলি সমাধান করার জন্য বিশেষভাবে ডিজাইন করা হয়েছিল। কোনও ifবিবৃতিতে নিয়ন্ত্রণের প্রকাশ হতে পারে তার উপর বিধিনিষেধকে আরও শক্তিশালী করা তারই একটি অংশ ছিল।

  4. সেখানে আশা কোনো কারণ কোন দুই প্রোগ্রামিং ভাষার কিছু একই ভাবে না। এমনকি সি এবং সি ++ এর মতো নিবিড়ভাবে সম্পর্কিত ভাষাগুলি কিছু আকর্ষণীয় উপায়ে ডাইভারেজ করে, যেমন আপনার আইনী সি প্রোগ্রাম থাকতে পারে যা আইনী সি ++ প্রোগ্রাম নয়, বা আইনী সি ++ প্রোগ্রামগুলি রয়েছে তবে বিভিন্ন শব্দার্থিক ইত্যাদি with


খুব দুঃখের বিষয়, আমি দুটি উত্তরকে "স্বীকৃত" হিসাবে চিহ্নিত করতে পারি না
টোগলি

1
হ্যাঁ, এটি প্রশ্নের একটি ভাল পুনঃস্থাপন। তবে প্রশ্নটি জিজ্ঞাসা করেছিল কেন দুটি ভাষার মধ্যে এই পার্থক্য রয়েছে। আপনি এটিকে মোটেই সম্বোধন করেননি।
দাউদ বলছেন মনিকাকে

@ দাউদিব্বন ক্যারিম: প্রশ্ন ছিল সি জাভা যখন না থেকে কেন রূপান্তর intকরতে পেরেছিল boolean। উত্তরটি হ'ল সি তে কোনও রূপান্তর নেই The ভাষাগুলি ভিন্ন কারণ সেগুলি ভিন্ন ভাষা।
জন বোদে

হ্যাঁ, "এটি দুর্বল বনাম শক্তিশালী টাইপিংয়ের বিষয়ে নয়"। কেবল অটো-বক্সিং এবং স্ব-আনবক্সিং দেখুন। সিটিতে সেগুলি থাকলে এটি কোনও স্কেলারার প্রকারটিকেও অনুমতি দেয় না।
উত্সাহক

5

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

সম্ভবত এটি কারণ ওপি প্রকৃত ত্রুটি বার্তা প্রকাশ করেনি এবং ^কেরেট সরাসরি =অ্যাসাইনমেন্ট অপারেটরের দিকে নির্দেশ করে to

তবে সংকলকটি নির্দেশ করছে = কারণ এটি অপারেটর যা শর্তসাপেক্ষে দেখানো অভিব্যক্তিটির চূড়ান্ত মান (এবং তাই চূড়ান্ত প্রকার) উত্পাদন করে।

এটি নীচের ধরণের ত্রুটি সহ একটি নন-বুলিয়ান মান পরীক্ষা করার বিষয়ে অভিযোগ করছে:

ত্রুটি: বেমানান প্রকার: ইন্টকে বুলিয়ান রূপান্তর করা যায় না

পূর্ণসংখ্যার টেস্টিং, কখনও কখনও সুবিধাজনক হলেও জাভা ডিজাইনাররা এড়াতে বেছে নেওয়া একটি সম্ভাব্য ক্ষতি বলে বিবেচিত হয়। সব পরে, জাভা টি সত্য বুলিয়ান ডাটা টাইপ , যা সি করে না (এটা কোন বুলিয়ান টাইপ আছে)

এটি সি এর পরীক্ষামূলক পয়েন্টারগুলিকে নাল / নন-নাল হয়ে if (p) ...এবং এর জন্যও প্রযোজ্য if (!p) ..., যা জাভা একইভাবে সুস্পষ্ট তুলনা অপারেটরের প্রয়োজনীয় বুলিয়ান গ্রহণের অনুমতি দেয় না।


1
সি আছে একটি বুলিয়ান টাইপ আছে। তবে এটি ifবিবৃতি চেয়ে নতুন ।
এমসাল্টাররা 12:57

3
@ এসএমএলটার্স সি'র বুলটি এখনও কভারের আওতায় একটি পূর্ণসংখ্যা, তাই আপনি এটি করতে পারেন bool b = ...; int v = 5 + b;। এটি সম্পূর্ণ বুলিয়ান প্রকারের ভাষাগুলির সাথে পৃথক, যা পাটিগণিতের ক্ষেত্রে ব্যবহার করা যায় না।
জুলাই

সি এর বুলিয়ানটি একটি খুব ছোট পূর্ণসংখ্যার। "সত্য" এবং "মিথ্যা" সহজেই ম্যাক্রো বা যে কোনও কিছুতে সংজ্ঞায়িত করা যায়।
ওসকার স্কোগ

4
@ জুলস: আপনি কেবল দেখিয়েছেন যে সি এর টাইপ-সুরক্ষা রয়েছে। শুধু কারণ একটি বুলিয়ান টাইপ ধর্মান্তরিত একটি পূর্ণসংখ্যা মান মানে এই নয় এটা হল একটি পূর্ণসংখ্যা প্রকার। আপনার যুক্তি অনুসারে, পূর্ণসংখ্যার int v = 5; float f = 2.0 + v;
ধরণগুলি

1
@ এসএমএলটাররা স্ট্যান্ডার্ড দ্বারা নির্ধারিত হিসাবে স্ট্যান্ডার্ড স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণেরগুলির মধ্যে একটি _Bool( .2.২.৫ / see দেখুন)।
Ruslan

2

অসামঞ্জস্যিত প্রকার: ইন্টকে বুলিয়ান রূপান্তর করা যায় না

আমি কেন আগ্রহী যে সি এটির অনুমতি দেয় না এবং জাভা কেন দেয় না। অতএব, আমি ভাষার টাইপ সিস্টেমে বিশেষত এর দৃness়তার বিষয়ে আগ্রহী।

আপনার প্রশ্নের দুটি অংশ রয়েছে:

জাভা কেন রূপান্তর করে intনা boolean?

যতটা সম্ভব স্পষ্ট করার উদ্দেশ্যে জাভাতে এটি ফোটে। এটি খুব স্ট্যাটিক, খুব টাইপ সিস্টেমের সাথে "আপনার মুখে"। অন্যান্য ভাষায় স্বয়ংক্রিয়ভাবে টাইপ-কাস্ট করা জিনিসগুলি জাভাতে হয় না। আপনাকেও লিখতে হবে int a=(int)0.5। রূপান্তর floatকরার intতথ্য হারাবে; রূপান্তর হিসাবে একই intথেকেboolean এবং এইভাবে ত্রুটি-প্রবণ হবে। এছাড়াও, তাদের প্রচুর সংমিশ্রণ নির্দিষ্ট করতে হবে। অবশ্যই, এই জিনিসগুলি সুস্পষ্ট বলে মনে হচ্ছে তবে তারা সাবধানতার দিক থেকে ভুল করার চেষ্টা করেছিল।

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

কেন ifঅন্য ধরণের গ্রহণ না boolean?

ifঅন্য ধরণের তুলনায় অনুমতি হিসাবে পুরোপুরি ভাল সংজ্ঞায়িত করা যেতে পারে boolean। এটির একটি সংজ্ঞা থাকতে পারে যা বলে যে নিম্নলিখিতটি সমতুল্য:

  • true
  • int != 0
  • String সঙ্গে .length>0
  • অন্য কোনও অবজেক্ট রেফারেন্স যা অ- null(এবং Booleanমান সহ নয় false)।
  • বা এমনকি: অন্য কোনও অবজেক্ট রেফারেন্স যা অ- nullএবং যার পদ্ধতি Object.check_if(কেবলমাত্র এই উপলক্ষে আমার দ্বারা উদ্ভাবিত) ফিরে আসে true

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

গভীর কারণ

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

চেহারা

ভাল, এবং শেষ পর্যন্ত, সম্ভবত এটি ভাষা ডিজাইনারদের কেবল একটি পছন্দ। প্রতিটি ভাষা তাদের নিজস্ব উপায়ে স্পিন করে বলে মনে হচ্ছে ...

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

রুবি আপনি যে কোনও ধরণের বস্তু এড়াতে পারেন তার সত্যতা খুঁজছেন। আকর্ষণীয়ভাবে যথেষ্ট, এটির এখনও কোনও booleanপ্রকার নেই (কারণ এটি কোনও আদিম নেই), এবং এটির কোনও শ্রেণিও নেই Boolean। যদি আপনি জিজ্ঞাসা করেন কোন শ্রেণীর মানটি trueরয়েছে (সহ সহজেই উপলব্ধ true.class) তবে আপনি পাবেন TrueClass। এই শ্রেণিতে আসলে পদ্ধতি রয়েছে, যিনি বুলিয়ানগুলির জন্য 4 অপারেটর ( | & ^ ==)। এখানে, ifএর মান falsey বিবেচনায় যদি এবং কেবল যদি এটা হয় হয় falseবা nil( nullরুবি)। বাকি সবই সত্য। সুতরাং, 0বা ""উভয় সত্য।

তাদের পক্ষে এমন একটি পদ্ধতি তৈরি করা তুচ্ছ হত Object#truthy?যা কোনও শ্রেণীর জন্য প্রয়োগ করা যেতে পারে এবং স্বতন্ত্র সত্যতা ফিরিয়ে দিতে পারে। উদাহরণস্বরূপ, String#truthy?খালি খালি স্ট্রিং বা হোয়ট নোটের ক্ষেত্রে সত্য হতে বাস্তবায়ন করা যেতে পারে। তারা করেনি, যদিও রুবি বেশিরভাগ বিভাগে জাভা বিরোধী (মিক্সিন সহ গতিশীল হাঁস-টাইপিং, পুনরায় খোলার ক্লাস এবং এগুলি সমস্ত)।

যা পার্ল প্রোগ্রামারের কাছে আশ্চর্যজনক হতে পারে যিনি $value <> 0 || length($value)>0 || defined($value)সত্যবাদী হয়ে অভ্যস্ত। ইত্যাদি।

এসকিউএলকে এর কনভেনশন সহ প্রবেশ করুন যে nullকোনও অভিব্যক্তির ভিতরে স্বয়ংক্রিয়ভাবে এটিকে মিথ্যা করে তোলে, তা যাই হোক না কেন। তাই (null==null) = false। রুবিতে (nil==nil) = true,। খুশি বার.


আসলে, ((int)3) * ((float)2.5)জাভাতে এটি বেশ ভালভাবে সংজ্ঞায়িত হয়েছে (এটি 7.5f))
পাওলো ইবারম্যান

আপনি ঠিক বলেছেন, @ পাওলোএবারম্যান, আমি সেই উদাহরণটি মুছে ফেলেছি।
AnoE

ওহো ... এখানে নিম্নচোটকারীদের মন্তব্য এবং যে উত্তরটি সত্যই উত্তর মুছতে ভোট দিয়েছিল তাদের প্রশংসা করবে।
AnoE

থেকে বাস্তবিক রূপান্তর intকরার floatসাধারন তথ্য হারায়। জাভা কি এই জাতীয় অন্তর্ভুক্ত নিক্ষেপ নিষিদ্ধ করে?
রুসলান

@ রাস্লান নং (দীর্ঘ দ্বিগুণ জন্য একই) - আমার ধারণা ধারণাটি হ'ল যে সম্ভাব্য তথ্য হ্রাস কেবলমাত্র স্বল্পতম গুরুত্বপূর্ণ জায়গাগুলিতেই হয় এবং কেবল তেমন ক্ষেত্রে ঘটে যায় যেগুলি এত গুরুত্বপূর্ণ নয় বলে বিবেচিত হয় (বেশিরভাগ পূর্ণসংখ্যার মান)।
পাওলো ইবারম্যান

1

অন্যান্য সূক্ষ্ম উত্তর ছাড়াও, আমি ভাষার মধ্যে ধারাবাহিকতা সম্পর্কে কথা বলতে চাই।

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

এ পর্যন্ত সব ঠিকই. এটি জাভা প্রয়োগ করে এবং কেবল যা জাভা প্রয়োগ করে।

অন্যান্য ভাষাগুলি অ-বুলিয়ান মানগুলির সুবিধার্থে আনার চেষ্টা করে। উদাহরণ স্বরূপ:

  • ধরা যাক nএকটি পূর্ণসংখ্যা সংক্ষিপ্ত if (n)হওয়ার জন্য সংজ্ঞা দিন if (n != 0)
  • ধরুন xএটি একটি ভাসমান-পয়েন্ট নম্বর। সংক্ষিপ্ত if (x)হওয়ার জন্য সংজ্ঞা দিন if (x != 0 && !isNaN(x))
  • ধরা যাক pএকটি পয়েন্টার টাইপ। সংক্ষিপ্ত if (p)হওয়ার জন্য সংজ্ঞা দিন if (p != null)
  • ধরা যাক sএকটি স্ট্রিং টাইপ। এখন if (s)হতে সংজ্ঞায়িতif (s != null && s != "")
  • ধরা যাক aএকটি অ্যারে টাইপ। এখন if (a)হতে সংজ্ঞায়িত if (a != null && a.length > 0)

শর্টহ্যান্ড সরবরাহ করার এই ধারণাটি যদি পৃষ্ঠায় ভাল বলে মনে হয় ... যতক্ষণ না আপনি ডিজাইন এবং মতামতের মধ্যে পার্থক্য তৈরি করেন:

  • if (0)সি, পাইথন, জাভাস্ক্রিপ্টে মিথ্যা হিসাবে বিবেচিত হবে; তবে রুবিতে সত্য হিসাবে বিবেচিত।
  • if ([]) পাইথনে মিথ্যা হিসাবে বিবেচিত তবে জাভাস্ক্রিপ্টে এটি সত্য।

একেকভাবে বা অন্যভাবে ভাবের চিকিত্সা করার জন্য প্রতিটি ভাষার নিজস্ব কারণ রয়েছে। (উদাহরণস্বরূপ, রুবি একমাত্র falsy মান falseএবং nil, অত 0truthy হয়।)

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


1
আপনি কি জানেন যে x != 0হিসাবে একই x != 0 && !isNaN(x)? এছাড়াও, এটি সাধারণত s != nullপয়েন্টারগুলির জন্য, তবে অ-পয়েন্টারগুলির জন্য অন্য কিছু।
প্রতিলিপি

@ ডেডুপ্লিকেটর কোন ভাষায় এটি একই?
পাওলো ইবারম্যান

1
আইইইই 75754, NaN ≠ 0. NaN ≠ মোটেও কিছু ব্যবহার। সুতরাং (x) যদি মৃত্যুদন্ড কার্যকর করে এবং যদি (! X) পাশাপাশি মৃত্যুদণ্ড কার্যকর করত ...
gnasher729

0

ওয়েল, সি, পয়েন্টার, বুলিয়ান (সি 99 এর পরে), সংখ্যা (ভাসমান পয়েন্ট বা না) এবং অঙ্কের (সংখ্যায় সরাসরি ম্যাপিংয়ের কারণে) প্রতিটি স্কেলারের ধরণের একটি "প্রাকৃতিক" মিথ্যা মান রয়েছে, সুতরাং এটি কোনও শর্তাধীন অভিব্যক্তির পক্ষে যথেষ্ট ভাল ।

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

শর্তসাপেক্ষ অভিব্যক্তিগুলি বুলিয়ান প্রকারের মধ্যে সীমাবদ্ধ করে কিনা তা নিয়ে বিতর্ক সৃষ্টি করেছিল এমন একটি ত্রুটি হ'ল একটি তুলনা করার উদ্দেশ্যে একটি অ্যাসাইনমেন্ট লেখার টাইপ না শর্তাধীন অভিব্যক্তি টাইপ সীমাবদ্ধ দ্বারা সুরাহা এ সব , কিন্তু একটি নগ্ন নিয়োগ প্রকাশ নামঞ্জুর করার ব্যবহার দ্বারা তার মান জন্য।

যে কোনও আধুনিক সি বা সি ++ সংকলক সহজেই হ্যান্ডেল করে, যদি জিজ্ঞাসা করা হয় তবে এই জাতীয় প্রশ্নকারীর জন্য সতর্কতা বা ত্রুটি দেয়।
এই ক্ষেত্রে যেখানে উদ্দেশ্যটি হ'ল ঠিক তেমনই, বন্ধনী যুক্ত করা সহায়তা করে।

সংক্ষিপ্তসার হিসাবে, বুলিয়ান (এবং জাভায় বক্সযুক্ত সমতুল্য) সীমাবদ্ধ করা =অ্যাসাইনমেন্ট সংকলন-ত্রুটিগুলি বেছে নেওয়ার কারণে টাইপগুলির শ্রেণি তৈরির ব্যর্থ প্রচেষ্টা বলে মনে হচ্ছে ।


==বুলিয়ান অপারেন্ডগুলির সাথে ব্যবহার করে , যার মধ্যে প্রথমটি একটি পরিবর্তনশীল (যা পরে টাইপ করা যেতে পারে =) এর ifসাথে অন্য ধরণের চেয়ে অনেক কম ঘটে, আমি বলব, সুতরাং এটি কেবল একটি আধা ব্যর্থ প্রচেষ্টা।
পাওলো ইবারম্যান

০.০ -> মিথ্যা এবং ০.০ -> ব্যতীত অন্য কোনও মান আমার কাছে আদৌ "প্রাকৃতিক" লাগে না।
gnasher729

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

আপনি অন্য কারণগুলি মিস করছেন। কি এর truthy মান সম্পর্কে "", (Object) "", 0.0, -0.0, NaN, খালি অ্যারে, এবং Boolean.FALSE? বিশেষত শেষটি মজার, কারণ এটি অ-নাল পয়েন্টার (সত্য) যা মিথ্যাতে আনবক্স করে। +++ আমি লেখাকেও ঘৃণা করি if (o != null), তবে আমাকে প্রতিদিন কয়েকটা অক্ষর সাশ্রয় করা এবং আমার "চতুর" অভিব্যক্তিটি ডিবাগ করার জন্য অর্ধেক দিন কাটাতে দেওয়া কোনও ভাল কাজ নয়। এটি বলেছিল, আমি জাভাটির জন্য কিছু মাঝারি উপায় দেখতে চাই: আরও উদার নিয়ম কিন্তু কোনও দ্বিপাক্ষিকতা ছাড়াই।
maarartinus

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

-1

আমার প্রশ্নটি খারাপ কোডিং শৈলীর সাথে সম্পর্কিত নয়। আমি এটির খারাপ জানি, তবে কেন সি এটির অনুমতি দেয় না এবং জাভা দেয় না সে সম্পর্কে আমি ছেদ করছি।

জাভা দুটি নকশা লক্ষ্য ছিল:

  1. বিকাশকারীকে ব্যবসায়ের সমস্যায় ফোকাস করার অনুমতি দিন। জিনিসগুলি সহজ এবং কম ত্রুটি-প্রবণ করুন, যেমন আবর্জনা সংগ্রহ করুন যাতে বিকাশকারীদের মেমরি ফুটোয় মনোযোগ দেওয়ার প্রয়োজন হয় না।

  2. প্ল্যাটফর্মগুলির মধ্যে পোর্টেবল , উদাহরণস্বরূপ যে কোনও সিপিইউ দিয়ে কোনও কম্পিউটারে চালান।

টাইপোসের কারণে অ্যাসপিরেশন হিসাবে অ্যাসাইনমেন্টের ব্যবহার প্রচুর বাগের কারণ হিসাবে পরিচিত ছিল, সুতরাং উপরের লক্ষ্য # 1 এর অধীনে, আপনি যেভাবে এটি ব্যবহার করার চেষ্টা করছেন তা অনুমোদিত নয়।

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


4
এটি জাভা 8-এ যুক্ত না করা পর্যন্ত সংখ্যার ধরণের এবং বুলিয়ানদের মধ্যে স্পষ্টরূপে castালাই নেই। বুলিয়ানতে একটি সংখ্যার মান রূপান্তর করতে আপনাকে তুলনামূলক অপারেটর ব্যবহার করতে হবে; আপনি সাধারণত টার্নারি অপারেটর ব্যবহার করে একটি বুলিয়ান মানকে এমন একটি সংখ্যায় রূপান্তর করতে।
পিটার টেলর

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

জাভা এর শূন্য এবং জাভা এর মিথ্যা হিসাবে "কিছু সিস্টেম 0 টি সত্য হিসাবে এবং 1 টি মিথ্যা হিসাবে গণ্য করে" এর কাছে তুচ্ছভাবে বহনযোগ্যতা নিশ্চিত করবে। এটি সম্পর্কে ওএস কী ভাবছে তা আসলেই কিছু যায় আসে না।
maaartinus

-1

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

ভাষার পুরানো সংস্করণগুলিতে Bচ্ছিক প্রকারগুলি "বুলিয়ান টাইপ" সমর্থন করে যাতে আপনি "যদি x! = শূন্য" এর পরিবর্তে "if x" লিখতে পারেন। যা একটি "ptionচ্ছিক বুল" ব্যবহার করে খুব বিভ্রান্ত করেছে। একটি alচ্ছিক বুলের মানগুলি শূন্য, মিথ্যা বা সত্য এবং "যদি খ" কার্যকর হয় না তবে খ খালি বা মিথ্যা হলে কার্যকর করা হত। এটি আর অনুমোদিত নয়।

এবং এমন এক লোক আছে যা আপনার দিগন্ত খুলতে সত্যই অপছন্দ করে ...

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