এই জাভা কোডটি সংকলন করে কেন?


96

পদ্ধতি বা শ্রেণিবক্ষে, নীচের লাইনটি (সতর্কতা সহ) সংকলন করে:

int x = x = 1;

শ্রেণীর সুযোগে, যেখানে ভেরিয়েবলগুলি তাদের ডিফল্ট মানগুলি পায় , নিম্নলিখিতটি 'অপরিবর্তিত রেফারেন্স' ত্রুটি দেয়:

int x = x + 1;

প্রথমটি x = x = 1কি একই 'অপরিজ্ঞাত রেফারেন্স' ত্রুটির সাথে শেষ হওয়া উচিত নয় ? অথবা সম্ভবত দ্বিতীয় লাইনের int x = x + 1সংকলন করা উচিত? নাকি আমি এখানে কিছু মিস করছি?


4
আপনি যদি staticশ্রেণি-স্কোপ ভেরিয়েবলটিতে কীওয়ার্ডটি যুক্ত করে থাকেন তবে static int x = x + 1;আপনি কি একই ত্রুটি পাবেন? কারণ সি # এ এটি স্থিতিশীল বা অ-স্থিতিশীল থাকলে কোনও পার্থক্য আনবে।
জেপ্প স্টিগ নীলসন

static int x = x + 1জাভা ব্যর্থ।
মার্সিন

4
সি # উভয় int a = this.a + 1;এবং int b = 1; int a = b + 1;শ্রেণি স্কোপে (উভয় জাভাতে ঠিক আছে) ব্যর্থ হয়, সম্ভবত §17.4.5.2 এর কারণে - "উদাহরণস্বরূপ ক্ষেত্রের জন্য একটি ভেরিয়েবল ইনিশিয়ালাইজারটি উদাহরণটি তৈরি করা যেতে পারে না।" আমি জানি না এটি সুস্পষ্টভাবে কোথাও অনুমতিপ্রাপ্ত কিনা তবে স্থিরিকর তেমন কোনও বাধা নেই। জাভাতে নিয়মগুলি আলাদা এবং static int x = x + 1একই কারণে ব্যর্থ int x = x + 1হয়
এমএসএম

বাইটকোডযুক্ত সেই আনসার কোনও সন্দেহ মুছে ফেলে।
রগ্রিপার

উত্তর:


101

tl; ডা

জন্য ক্ষেত্র , int b = b + 1অবৈধ কারণ bএকটি অবৈধ এগিয়ে রেফারেন্স b। আপনি আসলে লেখার মাধ্যমে int b = this.b + 1এটি ঠিক করতে পারেন , যা অভিযোগ ছাড়াই সংকলন করে।

জন্য স্থানীয় ভেরিয়েবল , int d = d + 1অবৈধ কারণ dব্যবহারের পূর্বে সক্রিয়া করা হয় না। ক্ষেত্রগুলির ক্ষেত্রে এটি নয় , যা সর্বদা ডিফল্ট-আরম্ভ হয়।

সংকলনের চেষ্টা করে আপনি পার্থক্যটি দেখতে পাচ্ছেন

int x = (x = 1) + x;

ক্ষেত্রের ঘোষণা হিসাবে এবং স্থানীয় পরিবর্তনশীল ঘোষণা হিসাবে। পূর্বের ব্যর্থ হবে, তবে শব্দার্থক পার্থক্যের কারণে পরবর্তীকালে সফল হবে।

ভূমিকা

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

আমরা এই পরীক্ষার প্রোগ্রাম জুড়ে ব্যবহার করব:

public class test {
    int a = a = 1;
    int b = b + 1;
    public static void Main(String[] args) {
        int c = c = 1;
        int d = d + 1;
    }
}

ঘোষণাপত্রটি bঅবৈধ এবং একটি illegal forward referenceত্রুটির সাথে ব্যর্থ ।
ঘোষণাপত্রটি dঅবৈধ এবং একটি variable d might not have been initializedত্রুটির সাথে ব্যর্থ ।

এই ত্রুটিগুলি পৃথক হওয়ার বিষয়টি উল্লেখ করা উচিত যে ত্রুটিগুলির কারণগুলিও পৃথক।

ক্ষেত্র

জাভাতে ফিল্ড ইনিশিয়ালাইজারগুলি জেএলএস §8.3.2 , ক্ষেত্রগুলির সূচনা দ্বারা পরিচালিত হয় ।

সুযোগ একটি ক্ষেত্রের সংজ্ঞায়িত করা হয় JLS §6.3 একটি ঘোষণাপত্র ব্যাপ্তি।

প্রাসঙ্গিক বিধিগুলি হ'ল:

  • mশ্রেণীর প্রকার সি (§8.1.6) দ্বারা ঘোষিত বা উত্তরাধিকার সূত্রে প্রাপ্ত কোনও সদস্যের ঘোষণার সুযোগ হ'ল কোনও নেস্টেড ধরণের ঘোষণাসহ সি এর পুরো সংস্থা।
  • উদাহরণস্বরূপ ভেরিয়েবলগুলির জন্য সূচনাপ্রকাশের অভিব্যক্তি ক্লাস দ্বারা ঘোষিত বা উত্তরাধিকার সূত্রে প্রাপ্ত কোনও স্থিতিশীল ভেরিয়েবলের সাধারণ নাম ব্যবহার করতে পারে, এমনকি যার ঘোষণা পরে পাঠ্যভাবে আসে occurs
  • উদাহরণস্বরূপ ভেরিয়েবলগুলির ব্যবহারের ঘোষণাপত্রের ব্যবহারের ব্যবহারটি কখনও কখনও সীমাবদ্ধ হওয়ার পরেও পাঠ্যগতভাবে প্রদর্শিত হয়, যদিও এই উদাহরণগুলি ভেরিয়েবলগুলি সুযোগসুবিধাতে রয়েছে। উদাহরণস্বরূপ ভেরিয়েবলের জন্য অগ্রণী রেফারেন্স পরিচালনা করার সঠিক নিয়মের জন্য §8.3.2.3 দেখুন।

§8.3.2.3 বলেছেন:

সদস্যের ক্লাস বা ইন্টারফেস সি এর উদাহরণ (যথাক্রমে স্থিতিশীল) ক্ষেত্র এবং নিম্নলিখিত সকল শর্তটি ধারণ করলেই সদস্যের ঘোষণাপত্রটি পাঠ্যক্রমে উপস্থিত হওয়া প্রয়োজন:

  • ব্যবহার সি এর একটি উদাহরণে (যথাক্রমে স্ট্যাটিক) পরিবর্তনশীল ইনিশিয়ালাইজার বা সি এর একটি উদাহরণে (যথাক্রমে স্ট্যাটিক) ইনিশিয়ালাইজারে ঘটে
  • ব্যবহার কোনও অ্যাসাইনমেন্টের বাম দিকে নেই।
  • ব্যবহারটি একটি সাধারণ নামের মাধ্যমে।
  • সি হল অভ্যন্তরীণতম শ্রেণি বা ইন্টারফেসটি ব্যবহারটি ঘিরে।

নির্দিষ্ট ক্ষেত্রে বাদে আপনি ক্ষেত্রগুলি ঘোষণার আগে তাদের উল্লেখ করতে পারেন। এই বিধিনিষেধগুলি কোডের মতো প্রতিরোধ করার উদ্দেশ্যে তৈরি

int j = i;
int i = j;

সংকলন থেকে। জাভা স্পেস বলছে "উপরোক্ত বিধিনিষেধগুলি সংকলন সময়ে, বিজ্ঞপ্তি বা অন্যথায় ত্রুটিযুক্ত প্রাথমিককরণগুলি ধরার জন্য ডিজাইন করা হয়েছে।"

এই নিয়মগুলি আসলে কীভাবে সিদ্ধ হয়?

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

int a = a = 1;প্রনয়ন করা হয়েছে কারণ এটি লঙ্ঘন করে (খ): রেফারেন্স a হয় নির্ধারিত হচ্ছে, তাই এটি পড়ুন করার বৈধতা পাবে aআগাম a'র সম্পূর্ণ ঘোষণা।

int b = this.b + 1এটি (সি) লঙ্ঘন করার কারণে এটিও সংকলন করে: রেফারেন্সটি this.bকোনও সাধারণ নাম নয় (এটি এর সাথে যোগ্য this.)। এই বিজোড় নির্মাণটি এখনও নিখুঁতভাবে সংজ্ঞায়িত, কারণ this.bমান শূন্য রয়েছে।

সুতরাং, প্রাথমিকভাবে, আরম্ভকারীদের মধ্যে ক্ষেত্রের রেফারেন্সের উপর বিধিনিষেধগুলি int a = a + 1সফলভাবে সংকলন হতে বাধা দেয় ।

লক্ষ করুন যে মাঠের ঘোষণাটি সংকলন int b = (b = 1) + bকরতে ব্যর্থ হবে , কারণ ফাইনালটি bএখনও অবৈধ ফরওয়ার্ড রেফারেন্স।

স্থানীয় পরিবর্তনশীল

স্থানীয় পরিবর্তনশীল ঘোষণাগুলি জেএলএস -14.4 , স্থানীয় চলক ঘোষণার বিবৃতি দ্বারা পরিচালিত হয় ।

সুযোগ একটি স্থানীয় ভেরিয়েবলের সংজ্ঞায়িত করা হয় JLS §6.3 , একটি ঘোষণাপত্র ব্যাপ্তি:

  • একটি ব্লকের স্থানীয় ভেরিয়েবল ঘোষণার সুযোগ (.414.4) যেখানে ব্লকের বাকী অংশটি যেখানে ঘোষণাপত্রটি উপস্থিত হয় তার নিজস্ব আরম্ভকারী দিয়ে শুরু করে এবং স্থানীয় ভেরিয়েবল ঘোষণার বিবৃতিতে ডানদিকে আরও কোনও ঘোষককে অন্তর্ভুক্ত করে।

নোট করুন যে ইনিশিয়ালাইজারগুলি ভেরিয়েবল ঘোষণার পরিধির মধ্যে রয়েছে। তাহলে কেন int d = d + 1;সংকলন হয় না ?

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

  • একটি স্থানীয় পরিবর্তনশীল বা খালি চূড়ান্ত ক্ষেত্র প্রতিটি অ্যাক্সেসের জন্য x, xস্পষ্টভাবে এক্সেস আগে নিয়োগ করা হবে, অথবা একটি কম্পাইল-টাইম এরর দেখা দেয়।

মধ্যে int d = d + 1;, অ্যাক্সেস dস্থানীয় পরিবর্তনশীল জরিমানা সমাধান করা হয়, কিন্তু যেহেতু অ্যাক্সেস dকরার আগে বরাদ্দ dকরা হয়নি, সংকলক একটি ত্রুটি জারি করে। ইন int c = c = 1, c = 1প্রথমে ঘটে, যা বরাদ্দ করে cএবং তারপরে cসেই অ্যাসাইনমেন্টের ফলাফলের সাথে আরম্ভ করা হয় (যা 1)।

মনে রাখবেন যে নির্দিষ্ট অ্যাসাইনমেন্ট বিধিগুলির কারণে, স্থানীয় পরিবর্তনশীল ঘোষণাটি সফলভাবে সংকলন int d = (d = 1) + d; করবে ( ক্ষেত্রের ঘোষণার বিপরীতেint b = (b = 1) + b ), কারণ dঅবশ্যই ফাইনালটি dপৌঁছানোর সময় দ্বারা নির্ধারিত হয়েছে ।


রেফারেন্সের জন্য +1, তবে আমি মনে করি আপনি এই শব্দটি ভুল পেয়েছেন: "int a = a = 1; সংকলন কারণ এটি (খ)" লঙ্ঘন করে ", যদি এটি 4 টির যে কোনও একটির প্রয়োজন লঙ্ঘন করে তবে তা সংকলন করবে না। তবে এটি যেহেতু এটা না IS একটি অ্যাসাইনমেন্টের বাম দিকে (JLS এর বাক্যে কথন দ্বিগুণ নেতিবাচক অনেক এখানে সাহায্য করে না)। ইন int b = b + 1খ অধিকার (বাম দিকে নয়) নিয়োগ তাই এটি এই লঙ্ঘন করবে আছে ...
msam

... আমি যা সম্পর্কে খুব বেশি নিশ্চিত নই: নিম্নলিখিত 4 টি শর্ত অবশ্যই পূরণ করতে হবে যদি অ্যাসাইনমেন্টের আগে ঘোষণাটি পাঠ্যভাবে উপস্থিত না হয়, এই ক্ষেত্রে আমি মনে করি ঘোষণাপত্রটি কার্যভারের আগে "পাঠ্যক্রমে" প্রদর্শিত হবে int x = x = 1, যার মধ্যে যদি এর কোনটিই প্রযোজ্য না।
এমএসএম

@ এসএসএম: এটি একটি বাজে বিভ্রান্তিকর, তবে মূলত আপনাকে একটি সামনের রেফারেন্স দেওয়ার জন্য চারটি শর্তের একটি লঙ্ঘন করতে হবে। যদি আপনার ফরোয়ার্ড রেফারেন্স চারটি শর্ত পূরণ করে তবে এটি অবৈধ।
nneonneo

@ এসএসএম: এছাড়াও, সম্পূর্ণ ঘোষণাটি কেবলমাত্র আরম্ভকারীর পরে কার্যকর হয়।
nneonneo

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

86
int x = x = 1;

সমতুল্য

int x = 1;
x = x; //warning here

যখন

int x = x + 1; 

প্রথমে আমাদের গণনা করা দরকার x+1তবে x এর মান জানা যায় না তাই আপনি ত্রুটি পান (সংকলক জানে যে x এর মান জানা যায় না)


4
এই প্লাসটি ওপেনসস থেকে ডান-সংযুক্তি সম্পর্কিত ইঙ্গিতটি আমি খুব দরকারী বলে মনে করেছি।
টবিএমসিএনমোবি

4
আমি ভেবেছিলাম একটি অ্যাসাইনমেন্টের রিটার্ন মান হ'ল ভেরিয়েবল মান নয়, বরাদ্দ করা মান।
zzzzBov

4
@ZzzBov ঠিক আছে। int x = x = 1;সমান int x = (x = 1), না x = 1; x = x; । এটি করার জন্য আপনার সংকলক সতর্কতা পাওয়া উচিত নয়।
নিনেনিও

int x = x = 1;অপারেটরের x = (x = 1)রাইট-অ্যাসোসিয়েটিভিটির কারণে =
ইন্টের

4
@ নিওনিও এবং int x = (x = 1)সমান্তরাল int x; x = 1; x = x;(পরিবর্তনশীল ঘোষণা, ফিল্ড ইনিশিয়ালাইজারের মূল্যায়ন, উক্ত মূল্যায়নের ফলে ভেরিয়েবলের অ্যাসাইনমেন্ট), সুতরাং সতর্কতা
এমএসএম

41

এটি মোটামুটি সমান:

int x;
x = 1;
x = 1;

প্রথমত, int <var> = <expression>;সর্বদা সমতুল্য

int <var>;
<var> = <expression>;

এক্ষেত্রে আপনার অভিব্যক্তিটিও এটি x = 1একটি বিবৃতি। x = 1বৈধ বিবৃতি, যেহেতু ভের xইতিমধ্যে ঘোষণা করা হয়েছে। এটি মান 1 এর সাথে একটি অভিব্যক্তি যা পরে xআবার নির্ধারিত হয়।


ঠিক আছে, তবে এটি যদি আপনি বলে যান তবে ক্লাস স্কোপে দ্বিতীয় বিবৃতি কেন ত্রুটি দেয়? মানে আপনি 0কীটের জন্য ডিফল্ট মান পেয়েছেন তাই ফলাফলটি 1 হবে না বলে আমি আশা করব undefined reference
মার্সিন

@ আইজোগফিফ উত্তরটি একবার দেখুন। কাজের মতো মনে হচ্ছে, কারণ সি ++ সংকলকটি ভেরিয়েবলগুলিকে ডিফল্ট মান নির্ধারণ করে। ক্লাস-লেভেল ভেরিয়েবলের জন্য জাভা একইভাবে করে।
মার্সিন

@ মার্সিন: জাভাতে, ইনটগুলি স্থানীয় ভেরিয়েবল হলে 0 থেকে শুরু হয় না । তারা সদস্য ভেরিয়েবল হলে কেবল তাদের 0 টি সূচনা করা হয়। সুতরাং আপনার দ্বিতীয় লাইনে, x + 1কোনও নির্ধারিত মান নেই, কারণ xএটি অবিবেচনাযুক্ত।
ওপেনসস

4
@OpenSauce কিন্তু x হয় একজন সদস্য পরিবর্তনশীল ( "বর্গ সুযোগ") হিসেবে সংজ্ঞায়িত করা।
জ্যাকব রায়হলে

@ জ্যাকোব্রাইহলে: আহ ঠিক আছে, সেই অংশটি খুঁজে পেল না। আমি নিশ্চিত নই যে বাইটকোড থেকে 0 থেকে কোনও ভেরিয়াল শুরু করার জন্য সংকলকটি তৈরি করেছে যদি এটি দেখায় যে এখানে একটি সুস্পষ্ট সূচনা নির্দেশ রয়েছে। এখানে একটি নিবন্ধ রয়েছে যা শ্রেণি এবং অবজেক্টের সূচনা সম্পর্কে কিছু বিশদে চলে গেছে, যদিও আমি মনে করি না যে এটি এই সঠিক সমস্যার সমাধান করে: javaworld.com/jw-11-2001/jw-1102- java101.html
ওপেনসস

12

জাভাতে বা যে কোনও আধুনিক ভাষায় অ্যাসাইনমেন্ট ডান দিক থেকে আসে।

ধরুন আপনার যদি দুটি ভেরিয়েবল x এবং y হয়,

int z = x = y = 5;

এই বিবৃতিটি বৈধ এবং এইভাবে সংকলক তাদের বিভক্ত করে।

y = 5;
x = y;
z = x; // which will be 5

তবে আপনার ক্ষেত্রে

int x = x + 1;

সংকলক একটি ব্যতিক্রম দিয়েছে কারণ, এটি এর মতো বিভক্ত হয়।

x = 1; // oops, it isn't declared because assignment comes from the right.

সতর্কতাটি x = x নয় x = 1
অসীম গাফফার

8

int x = x = 1; এর সমান নয়:

int x;
x = 1;
x = x;

জাভাপ আবার আমাদের সহায়তা করে, এগুলি এই কোডের জন্য জেভিএমের নির্দেশিকা:

0: iconst_1    //load constant to stack
1: dup         //duplicate it
2: istore_1    //set x to constant
3: istore_1    //set x to constant

অনেকটা এরকম:

int x = 1;
x = 1;

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

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

যদি আমরা লিখি:

int b, c, d, e, f;
int a = b = c = d = e = f = 5;

সমান:

f = 5
e = 5
d = 5
c = 5
b = 5
a = 5

ডান বেশিরভাগ এক্সপ্রেশনটি কেবল কোনও পুনরাবৃত্তি ছাড়াই একের পর এক চলকগুলিতে বরাদ্দ করা হয়। আমরা আমাদের যেভাবে ভেরিয়েবলগুলিকে গণ্ডগোল করতে পারি:

a = b = c = f = e = d = a = a = a = a = a = e = f = 5;

7

ইন int x = x + 1;আপনি X 1 যোগ, তাই কি মান x, এটা এখনো তৈরি না।

কিন্তু ইন int x=x=1;কোনও ত্রুটি সহ সঙ্কলন করবে কারণ আপনি 1 এ নিয়োগ করেছেন x


5

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


5

কোডের দ্বিতীয় অংশে, x এর ঘোষণার আগে x ব্যবহার করা হয়, যখন কোডের প্রথম টুকরোটিতে এটি কেবল দু'বার বরাদ্দ করা হয় যা কোনও অর্থ দেয় না তবে বৈধ।


5

আসুন এটি ধাপে ধাপে ধাপে, ডান সহযোগী

int x = x = 1

x = 1, 1 একটি ভেরিয়েবল এক্স নিয়োগ

int x = xএক্সটি নিজের কাছে নির্ধারিত হিসাবে একটি অন্তর্নিহিত হিসাবে। যেহেতু x আগে 1 হিসাবে নির্ধারিত হয়েছিল, এটি অনর্থক ফ্যাশনে হলেও এটি 1 টি ধরে রাখে।

যে জরিমানা সংকলন।

int x = x + 1

x + 1, একটি ভেরিয়েবল এক্স যোগ করুন। যাইহোক, এক্স অপরিবর্তিত হওয়া এটি একটি সংকলন ত্রুটির কারণ হবে।

int x = x + 1সমাপ্তির ডান অংশ হিসাবে এই লাইন ত্রুটিগুলি সংকলন করে একটি অপসাইন্ডেড ভেরিয়েবলের সাথে একটি যুক্ত করে সংকলন করে না


না, যখন দুটি =অপারেটর থাকে তখন এটি ডান-অ্যাসোসিয়েটিভ , সুতরাং এটি একই int x = (x = 1);
জেপ্প স্টিগ নীলসন

আহ, আমার আদেশ বন্ধ। এর জন্যে দুঃখিত. তাদের পিছনের দিকে করা উচিত ছিল। আমি এখন এটিকে ঘুরিয়ে দিয়েছি।
স্টিভেনটরিস

3

দ্বিতীয়টিটি int x=x=1সংকলন করা হয়েছে কারণ আপনি x এর মান নির্ধারণ করছেন তবে অন্য ক্ষেত্রে int x=x+1এখানে ভেরিয়েবল এক্সটি আরম্ভ করা হয়নি, জাভাতে মনে রাখবেন স্থানীয় ভেরিয়েবলটি ডিফল্ট মান হিসাবে আরম্ভ হয় না। দ্রষ্টব্য যদি এটি ( int x=x+1) শ্রেণিতেও থাকে তবে ভেরিয়েবলটি তৈরি না হওয়ায় এটি সংকলন ত্রুটিও দেয়।


2
int x = x + 1;

সতর্কতা সহ ভিজ্যুয়াল স্টুডিও ২০০৮ সালে সাফল্যের সাথে সংকলন করে

warning C4700: uninitialized local variable 'x' used`

4
বিরতি। এটা কি সি / সি ++?
মার্সিন

@ মার্সিন: হ্যাঁ, এটি সি ++। @ এসএমএম: দুঃখিত, আমি মনে করি আমি cপরিবর্তে ট্যাগটি দেখেছি javaতবে স্পষ্টতই এটি অন্য প্রশ্ন।
izogfif

এটি সংকলন করে কারণ সি ++ এ, সংকলকগণ প্রাথমিক প্রকারের জন্য ডিফল্ট মান নির্ধারণ করে। ব্যবহার করুন bool y;এবং y==trueমিথ্যা ফিরে আসবে।
শ্রী হর্ষ চিলকাপতি

@ শ্রীহর্ষচিলাপতি, এটি কি সি ++ কম্পাইলারের কোনও ধরণের মান? কারণ আমি যখন void main() { int x = x + 1; printf("%d ", x); }ভিজ্যুয়াল স্টুডিও ২০০৮-এ সংকলন করি, তখন ডিবাগ-এ আমি ব্যতিক্রম পাই এবং মুক্তিতে আমি কনসোলে মুদ্রিত Run-Time Check Failure #3 - The variable 'x' is being used without being initialized.নম্বর পাই 1896199921
izogfif

4
@ শ্রীহর্ষচিলাপতি অন্যান্য ভাষার বিষয়ে কথা বলছেন: সি # তে একটি staticক্ষেত্রের (শ্রেণি-স্তরের স্থিতিশীল ভেরিয়েবল) জন্য একই নিয়ম প্রযোজ্য। উদাহরণস্বরূপ ক্ষেত্রটি public static int x = x + 1;ভিজ্যুয়াল সি # তে সতর্কতা ছাড়াই সংকলন হিসাবে ঘোষিত । জাভাতেও সম্ভবত একই?
জেপ্প স্টিগ নীলসন

2

x এর মধ্যে আরম্ভ হয় না x = x + 1;

জাভা প্রোগ্রামিং ভাষাটি স্ট্যাটিকালি-টাইপযুক্ত, যার অর্থ সমস্ত ভেরিয়েবলগুলি ব্যবহারের আগে তাদের প্রথমে ঘোষণা করতে হবে।

দেখুন আদিম ধরনের তথ্য


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

@ জোনবাইট: ধরণের ধরণের ভেরিয়েবল ঘোষণার প্রয়োজনীয়তার সাথে স্ট্যাটিক টাইপিংয়ের কোনও সম্পর্ক নেই। উদাহরণস্বরূপ, আনুষাঙ্গিক প্রকারের সাথে স্ট্যাটিকালি টাইপ করা ভাষা রয়েছে।
হামার

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

2

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

int x;
x = (x = 1); // (x = 1) returns 1 so there is no error

যাইহোক, কোডের আপনার দ্বিতীয় টুকরা মধ্যে, int x = x + 1, + 1বিবৃতি প্রয়োজন xসংজ্ঞায়িত করা হয়, যা তারপর এটা নয়। যেহেতু অ্যাসাইনমেন্ট স্টেটমেন্টগুলি সর্বদা কোডটির ডানদিকে কোড আগে =চালিত হয়, তাই কোডটি ব্যর্থ হবে কারণ xসংজ্ঞায়িত। জাভা এইভাবে কোড চালাত:

int x;
x = x + 1; // this line causes the error because `x` is undefined

-1

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

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