সি তে অ্যারে ইনিশিয়ালাইজেশন সম্পর্কে বিভ্রান্তি


102

সি ভাষায়, যদি এর মতো একটি অ্যারে শুরু করে:

int a[5] = {1,2};

তারপরে অ্যারের সমস্ত উপাদান যা স্পষ্টভাবে আরম্ভ করা হয়নি তা জিরো দিয়ে সুস্পষ্টভাবে আরম্ভ করা হবে।

তবে, যদি আমি এর মতো একটি অ্যারে শুরু করি:

int a[5]={a[2]=1};

printf("%d %d %d %d %d\n", a[0], a[1],a[2], a[3], a[4]);

আউটপুট:

1 0 1 0 0

আমি বুঝতে পারছি না, এর পরিবর্তে a[0]প্রিন্ট কেন ? এটা কি অপরিবর্তিত আচরণ?10

দ্রষ্টব্য: এই প্রশ্নটি একটি সাক্ষাত্কারে জিজ্ঞাসা করা হয়েছিল।


35
অভিব্যক্তিটি a[2]=1মূল্যায়ন করে 1
tkausl

14
খুব গভীর প্রশ্ন। আমি ভাবছি যে সাক্ষাত্কারটি উত্তরটি নিজেরাই জানে কিনা। আমি না। প্রকৃতপক্ষে বাহ্যভাবে অভিব্যক্তির মান a[2] = 1হ'ল 1তবে আমি নিশ্চিত নই যে আপনি যদি প্রথম উপাদানটির মান হিসাবে কোনও মনোনীত ইনিশিয়েশনার এক্সপ্রেশনটির ফলাফল গ্রহণের অনুমতি পান তবে তা নিশ্চিত নই। আপনি আইনজীবীর ট্যাগ যুক্ত করেছেন এর অর্থ আমার কাছে মনে হয় মানটির বরাত দিয়ে আমাদের একটি উত্তর প্রয়োজন।
বাথশেবা

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

1
@ বাথশেবা আমি এর বিপরীতে করব, কারণ এখানে উত্তর এখন উভয় প্রশ্নের উত্তর দেয়।
বিদায় SE

1
@ বাথশেবা সেরা হবে। তবুও আমি ওপিকে প্রশ্নের উত্তর দেই, কারণ তিনি বিষয়টি নিয়ে আসেন। তবে আমার ঠিক কী "সঠিক জিনিস" মনে হবে তা সিদ্ধান্ত নেওয়ার পক্ষে এটি নয়।
বিদায় SE

উত্তর:


95

টিএল; ডিআর: আমি মনে করি না int a[5]={a[2]=1};কমপক্ষে C99 এ আচরণ ভালভাবে সংজ্ঞায়িত হয়েছে is

মজার অংশটি হ'ল যে বিটটি আমার কাছে বোধগম্য তা হল আপনি যে অংশটি সম্পর্কে জিজ্ঞাসা করছেন a[0]সেটি সেট করা হয়েছে 1কারণ অ্যাসাইনমেন্ট অপারেটর নির্ধারিত মানটি ফেরত দেয়। এটি অস্পষ্ট অন্য সব কিছু।

তাহলে কোড ছিল int a[5] = { [2] = 1 }, সবকিছু সহজ চলেছি হবে: এটা একটা সেটিং সূচনাকারী মনোনীত এর a[2]থেকে 1এবং অন্য সব কিছুর 0। কিন্তু { a[2] = 1 }আমাদের একটি অ্যাসাইনমেন্ট এক্সপ্রেশন সহ একটি অ-মনোনীত ইনিশিয়ালাইজার রয়েছে এবং আমরা একটি খরগোশের গর্তে পড়ে যাই।


আমি এখন পর্যন্ত যা পেয়েছি তা এখানে:

  • a স্থানীয় ভেরিয়েবল হতে হবে।

    6.7.8 সূচনা

    1. স্থিতিশীল স্টোরেজ সময়কালের জন্য কোনও অবজেক্টের জন্য ইনিশিয়ালাইজারের সমস্ত এক্সপ্রেশন হ'ল ধ্রুবক প্রকাশ বা স্ট্রিং লিটারাল।

    a[2] = 1ধ্রুবক প্রকাশ নয়, সুতরাং aস্বয়ংক্রিয় স্টোরেজ থাকতে হবে have

  • a নিজস্ব ইনিশিয়ালেশনে সুযোগ রয়েছে।

    .2.২.১ সনাক্তকারীদের স্কোপ

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

    ঘোষক হ'ল a[5], সুতরাং ভেরিয়েবলগুলি তাদের নিজস্ব আরম্ভের সুযোগে রয়েছে ization

  • a তার নিজস্ব সূচনাতে জীবিত।

    .2.২.৪ বস্তুর স্টোরেজ সময়কাল

    1. একটি বস্তু যার আইডেন্টিফায়ার কোন দুটো ঘটনার সঙ্গে এবং স্টোরেজ-শ্রেণী সুনির্দিষ্টভাবে উল্লেখ করা ছাড়া ঘোষিত হয় staticহয়েছে স্বয়ংক্রিয় স্টোরেজ সময়কাল

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

  • এর পরে সিকোয়েন্স পয়েন্ট রয়েছে a[2]=1

    6.8 বিবৃতি এবং ব্লক

    1. একটি পূর্ণ প্রকাশটি এমন একটি অভিব্যক্তি যা অন্য কোনও অভিব্যক্তির বা ঘোষণাকারীর অংশ নয়। নিম্নলিখিতগুলির প্রতিটি একটি সম্পূর্ণ প্রকাশ: একটি আরম্ভকারী ; একটি অভিব্যক্তি বিবৃতিতে অভিব্যক্তি; নির্বাচনী বিবৃতি নিয়ন্ত্রণকারী অভিব্যক্তি (if বা switch); একটি whileবা doবিবৃতি নিয়ন্ত্রণ নিয়ন্ত্রণ ; প্রতিবেদনের প্রতিটি ()চ্ছিক) প্রকাশ for; (alচ্ছিক) একটি returnবিবৃতিতে প্রকাশ। সম্পূর্ণ প্রকাশের শেষটি একটি সিকোয়েন্স পয়েন্ট।

    নোট যে যেমন অংশ initializers একটি বক্রবন্ধনী-ঘিরা তালিকা, প্রতিটি যা পরে একটি ক্রম বিন্দু আছে।int foo[] = { 1, 2, 3 }{ 1, 2, 3 }

  • ইনিশিয়ালাইজেশন ইনিশিয়ালাইজার তালিকার ক্রমে সঞ্চালিত হয়।

    6.7.8 সূচনা

    1. প্রতিটি ব্রেস-সংযুক্ত আরম্ভকারী তালিকার একটি সম্পর্কিত বর্তমান অবজেক্ট থাকে । যখন কোনও পদবি উপস্থিত না থাকে, বর্তমান অবজেক্টের ধরণ অনুসারে বর্তমান অবজেক্টের সাবোবজ্যাক্টগুলি ক্রমে সূচনা করা হয়: সাবস্ক্রিপ্ট ক্রমবর্ধমান অ্যারে উপাদানসমূহ, ঘোষণার ক্রমে কাঠামোর সদস্য এবং কোনও ইউনিয়নের প্রথম নামপ্রাপ্ত সদস্য। [...]

     

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

    6.7.8 সূচনা

    1. আরম্ভের তালিকার এক্সপ্রেশনগুলির মধ্যে যে ক্রমের কোনও পার্শ্ব প্রতিক্রিয়া ঘটে তা অনির্দিষ্ট।

যাইহোক, এটি এখনও কিছু প্রশ্ন উত্তরহীন:

  • সিকোয়েন্স পয়েন্টগুলি কি প্রাসঙ্গিক? প্রাথমিক নিয়মটি হ'ল:

    6.5 এক্সপ্রেশন

    1. পূর্ববর্তী এবং পরবর্তী সিকোয়েন্স পয়েন্টের মধ্যে একটি অবজেক্টের মূল্যায়নের মাধ্যমে কোনও বস্তুর তার সঞ্চিত মানটি একবারে পরিবর্তিত হবে । তদ্ব্যতীত, পূর্বের মানটি কেবলমাত্র সংরক্ষণ করা হবে তা নির্ধারণের জন্য পড়তে হবে।

    a[2] = 1 এটি একটি অভিব্যক্তি, তবে আরম্ভ নয়।

    এটি অ্যানেক্স জে দ্বারা সামান্য বিপরীত:

    J.2 অপরিবর্তিত আচরণ

    • দুটি সিকোয়েন্স পয়েন্টের মধ্যে, কোনও বস্তু একাধিকবার সংশোধন করা হয়, বা সংশোধন করা হয় এবং পূর্বের মানটি সংরক্ষণ করার জন্য মান নির্ধারণ করা (6.5) ব্যতীত অন্য পাঠ করা হয়।

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

  • ইনিশিয়ালার এক্সপ্রেশনগুলির সাথে সম্পর্কিত সাবওজেক্ট ইনিশিয়ালাইজেশন কীভাবে হয়? সমস্ত প্রাথমিককরণ কি প্রথমে মূল্যায়ন করা হয় (কিছু ক্রমে), তবে সাবোবজেক্টগুলি ফলাফল (আরম্ভকারী তালিকার ক্রমে) দিয়ে শুরু করা হয়? নাকি এগুলি আন্তঃলিপ্ত থাকতে পারে?


আমি মনে করি int a[5] = { a[2] = 1 }নিম্নলিখিত হিসাবে কার্যকর করা হয়েছে:

  1. জন্য স্টোরেজ a থাকা ব্লক প্রবেশ করা হলে এর বরাদ্দ করা হয়। বিষয়বস্তু এই মুহুর্তে অনির্ধারিত।
  2. (কেবলমাত্র) আরম্ভকারীটি কার্যকর করা হয় ( a[2] = 1) এবং তারপরে একটি সিকোয়েন্স পয়েন্ট। এটি সঞ্চয় 1করে a[2]এবং ফিরে আসে1
  3. এটি 1আরম্ভ করার জন্য ব্যবহৃত হয় a[0](প্রথম আরম্ভকারী প্রথম সাবোবজেক্টটি আরম্ভ করে)।

কিন্তু এখানে কিছু ঝাপসা কারণ অবশিষ্ট উপাদানের (পেতে a[1], a[2], a[3], a[4]) এর সক্রিয়া করা অনুমিত হয় 0, কিন্তু এটা পরিষ্কার নয় যখন: এটা আগে ঘটবে a[2] = 1মূল্যায়ন করা হয়? যদি তা হয় a[2] = 1তবে "জিত" এবং ওভাররাইট করা হবে a[2], তবে শূন্য আরম্ভ এবং অ্যাসাইনমেন্ট এক্সপ্রেশনটির মধ্যে কোন সিকোয়েন্স পয়েন্ট না থাকায় সেই অ্যাসাইনমেন্টটির কি পূর্বনির্ধারিত আচরণ হবে? সিকোয়েন্স পয়েন্টগুলি কি প্রাসঙ্গিক (উপরে দেখুন)? বা শূন্য সূচনা কি সমস্ত প্রাথমিককরণের মূল্যায়ন করার পরে ঘটে? যদি তাই হয়, a[2]সত্তা শেষ করা উচিত 0

যেহেতু সি স্ট্যান্ডার্ডটি এখানে কী ঘটে তা স্পষ্টভাবে সংজ্ঞায়িত করে না, আমি বিশ্বাস করি যে আচরণটি অপরিবর্তিত (বাদ দিয়ে)।


1
অপরিবর্তিত পরিবর্তে আমি যুক্তি দিয়ে বলব যে এটি অনির্দিষ্ট , যা বাস্তবায়নের মাধ্যমে ব্যাখ্যার জন্য উন্মুক্ত রেখে দেয়।
কিছু প্রোগ্রামার ডিউড

1
"আমরা একটি খরগোশের গর্তে পড়ে" LOL! কোনও ইউবি বা অনির্ধারিত স্টাফের জন্য এটি কখনও শুনেনি।
BЈовић

2
@ সোমোপ্রগ্রামমারডুড আমি মনে করি না এটি অনির্দিষ্ট করা যেতে পারে ("এমন আচরণ যেখানে এই আন্তর্জাতিক স্ট্যান্ডার্ডটি দুটি বা ততোধিক সম্ভাব্যতা সরবরাহ করে এবং কোনও প্রয়োজনে এর উপরে আরও প্রয়োজনীয়তা আরোপ করে না ") কারণ মানকটি আসলে কোনও সম্ভাবনা সরবরাহ করে না যার মধ্যে পছন্দ করা. এটি কেবল যা হয় তা বলে না, যা আমি বিশ্বাস করি যে " এই আন্তর্জাতিক স্ট্যান্ডার্ডে [...] আচরণের কোনও সুস্পষ্ট সংজ্ঞা বাদ দিয়ে " অপরিজ্ঞাত আচরণটি [...] এর আওতায় আসে "
মেলপোমেন

2
@ বিЈовић এটি কেবল অপরিজ্ঞাত আচরণের জন্যই নয়, সংজ্ঞায়িত আচরণেরও একটি খুব সুন্দর বর্ণনা যা ব্যাখ্যা করার জন্য এই জাতীয় থ্রেডের প্রয়োজন।
gnasher729

1
@ জনবোলিংগার পার্থক্যটি হ'ল আপনি সাবোবজেক্টটির প্রাথমিককরণের a[0]মূল্যায়ন করার আগে প্রকৃতপক্ষে আরম্ভ করতে পারবেন না এবং কোনও প্রাথমিককরণের মূল্যায়ণে একটি সিকোয়েন্স পয়েন্ট অন্তর্ভুক্ত রয়েছে (কারণ এটি একটি "সম্পূর্ণ অভিব্যক্তি")। অতএব আমি বিশ্বাস করি যে সাবওবজেক্টটি আমরা সূচনা করছি সেটি পরিবর্তন করা মোটামুটি খেলা।
মেলপোমেন

22

আমি বুঝতে পারছি না, এর পরিবর্তে a[0]প্রিন্ট কেন ?10

সম্ভবত প্রথমে a[2]=1আরম্ভ হয় a[2]এবং অভিব্যক্তির ফলাফলটি আরম্ভ করার জন্য ব্যবহৃত হয় a[0]

N2176 (সি 17 খসড়া) থেকে:

6.7.9 সূচনা

  1. সূচনা তালিকা প্রকাশের মূল্যায়নগুলি অনির্দিষ্টকালের জন্য একে অপরের প্রতি শ্রদ্ধার সাথে ক্রমযুক্ত হয় এবং এইভাবে কোনও পার্শ্ব প্রতিক্রিয়া ঘটে তা ক্রমযুক্ত হয় না। 154)

সুতরাং মনে হয় যে আউটপুট 1 0 0 0 0এছাড়াও সম্ভব ছিল।

উপসংহার: প্রারম্ভিক লেখাগুলি লিখবেন না যা ফ্লাইতে প্রারম্ভিক পরিবর্তনশীলকে সংশোধন করে।


1
এই অংশটি প্রযোজ্য নয়: এখানে কেবলমাত্র একটি ইনিশিয়ালাইজার এক্সপ্রেশন রয়েছে, সুতরাং এটি কোনও কিছুর সাথে ক্রমযুক্ত হওয়ার দরকার নেই need
মেলপোমেন

@ মেলপোমেন এমন {...}এক্সপ্রেশন রয়েছে যা সূচনা a[2]করে 0এবং a[2]=1উপ-এক্সপ্রেশন যা সূচনা a[2]করে 1
ব্যবহারকারী 694733

1
{...}একটি বন্ধনী আরম্ভকারী তালিকা। এটা কোন অভিব্যক্তি নয়।
মেলপোমেন

@ মেলপোমেন ঠিক আছে, আপনি ঠিক সেখানে থাকতে পারেন। তবে আমি এখনও তর্ক করব যে এখনও 2 টি প্রতিযোগিতামূলক পার্শ্ব-প্রতিক্রিয়া রয়েছে যাতে অনুচ্ছেদটি দাঁড়িয়ে থাকে।
ব্যবহারকারী 694733

@ মেল্পোমেনে দুটি জিনিসই সিকোয়েন্সড রয়েছে: প্রথম ইনিশিয়ালাইজার এবং অন্য উপাদানগুলির সেটিং 0
এমএম

6

আমি মনে করি সি 11 মানকটি এই আচরণটি কভার করে এবং বলে যে ফলাফল অনির্দিষ্ট , এবং আমি মনে করি না C18 এই ক্ষেত্রে কোনও প্রাসঙ্গিক পরিবর্তন করেছে।

মানক ভাষাটি বিশ্লেষণ করা সহজ নয়। স্ট্যান্ডার্ডটির প্রাসঙ্গিক বিভাগটি Initial6.7.9 ইনিশিয়ালেশন । বাক্য গঠনটি নথিভুক্ত করা হয়:

initializer:
                assignment-expression
                { initializer-list }
                { initializer-list , }
initializer-list:
                designationopt initializer
                initializer-list , designationopt initializer
designation:
                designator-list =
designator-list:
                designator
                designator-list designator
designator:
                [ constant-expression ]
                . identifier

নোট করুন যে শর্তগুলির মধ্যে একটি হ'ল অ্যাসাইনমেন্ট-এক্সপ্রেশন এবং যেহেতু a[2] = 1indubitably একটি অ্যাসাইনমেন্ট এক্সপ্রেশন তাই অ স্থিতিক সময়কালীন অ্যারেগুলির জন্য এটি আরম্ভকারীদের অভ্যন্তরে অনুমোদিত হয়:

§4 স্ট্যাটিক বা থ্রেড স্টোরেজ সময়কাল এমন কোনও অবজেক্টের জন্য ইনিশিয়ালাইজারের সমস্ত এক্সপ্রেশন হ'ল স্থির এক্সপ্রেশন বা স্ট্রিং লিটারাল।

মূল অনুচ্ছেদের মধ্যে একটি:

§19 সূচনাটি আরম্ভকারী তালিকার ক্রমে সংঘটিত হবে, প্রতিটি ইনিশিয়ালাইজার একই সাবোবজেক্টের জন্য পূর্বের তালিকাভুক্ত কোনও প্রাথমিক সূচককে ওভাররাইড করে নির্দিষ্ট সাবোবজেক্টের জন্য সরবরাহ করা হয়; 151) সমস্ত সাবওজেক্টস যা স্পষ্টভাবে আরম্ভ করা হয়নি তা স্পষ্টভাবে আরম্ভ করা হবে স্থিতিশীল স্টোরেজ সময়কালযুক্ত অবজেক্টগুলির মতোই।

151) সাবোবজেক্টের জন্য কোনও ইনিশিয়ালাইজার যা ওভাররাইড হয়ে গেছে এবং তাই আরম্ভ করতে ব্যবহৃত হয়নি যে সাবোবজেক্টটি মোটেও মূল্যায়ন করা যায় না।

এবং অন্য কী অনুচ্ছেদে হ'ল:

§ 23 সূচনা তালিকা প্রকাশের মূল্যায়নগুলি অনির্দিষ্টকালের জন্য একে অপরের প্রতি সম্মানযুক্ত এবং এভাবে কোনও পার্শ্বপ্রতিক্রিয়ার ক্রমটি অনির্ধারিত। 152)

152) বিশেষত, মূল্যায়ন আদেশ সাবোবজেক্ট আরম্ভের ক্রমের মতো হওয়া উচিত নয়।

আমি মোটামুটি নিশ্চিত যে অনুচ্ছেদ § 23 ইঙ্গিত দেয় যে প্রশ্নটিতে চিহ্নিতকরণ:

int a[5] = { a[2] = 1 };

অনির্দিষ্ট আচরণ বাড়ে। অ্যাসাইনমেন্টটি a[2]একটি পার্শ্ব-প্রতিক্রিয়া, এবং অভিব্যক্তিগুলির মূল্যায়ন ক্রম একে অপরের প্রতি শ্রদ্ধার সাথে অনিচ্ছাকৃতভাবে ক্রমযুক্ত। ফলস্বরূপ, আমি মনে করি না যে স্ট্যান্ডার্ডের কাছে আবেদন করার এবং দাবি করার কোনও উপায় আছে যে কোনও নির্দিষ্ট সংকলক এটি সঠিকভাবে বা ভুলভাবে পরিচালনা করছে।


কেবলমাত্র একটি সূচনা তালিকা এক্সপ্রেশন রয়েছে, সুতরাং §23 প্রাসঙ্গিক নয়।
মেলপোমেন

2

আমার বোধগম্যর a[2]=1মান 1 ফেরত দেয় তাই কোড হয়ে যায়

int a[5]={a[2]=1} --> int a[5]={1}

int a[5]={1}একটি [0] = 1 এর জন্য মূল্য নির্ধারণ করুন

অত: পর এটি মুদ্রণ 1 জন্য একটি [0]

উদাহরণ স্বরূপ

char str[10]={‘H’,‘a’,‘i’};


char str[0] = H’;
char str[1] = a’;
char str[2] = i;

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

আমার সন্দেহ আছে। আমি কি ধারণাটি ভুল পোস্ট করেছি? আপনি কি আমাকে এই দিয়ে পরিষ্কার করতে পারেন?
কার্ত্তিকা

1
আপনি কেবল কারণগুলির জন্য অনুমান করেন, যদিও ইতিমধ্যে মানের প্রাসঙ্গিক অংশগুলির সাথে ইতিমধ্যে একটি খুব ভাল উত্তর দেওয়া হয়েছে। কীভাবে এটি ঘটতে পারে তা কেবল প্রশ্নটিই প্রশ্নটি নয়। এটি স্ট্যান্ডার্ড যা বলে তা হওয়া উচিত।
বিদায় SE

কিন্তু যে ব্যক্তি উপরে প্রশ্ন পোস্ট করেছে সে কারণ জিজ্ঞাসা করেছিল এবং কেন এটি ঘটে? কেবলমাত্র আমি এই উত্তরটি ফেলেছি ut তবে ধারণাটি সঠিক ight রাইট?
কার্ত্তিকা

ওপি জিজ্ঞাসা করেছিলেন " এটি কি অপরিজ্ঞাত আচরণ? " আপনার উত্তর বলে না।
মেলপোমেন

1

আমি ধাঁধাটির জন্য একটি ছোট এবং সহজ উত্তর দেওয়ার চেষ্টা করি: int a[5] = { a[2] = 1 };

  1. প্রথম a[2] = 1সেট করা হয়। এর অর্থ অ্যারে বলে:0 0 1 0 0
  2. তবে দেখুন, আপনি এটি { }বন্ধনীতে এটি করেছেন , যা অ্যারেটি ক্রম হিসাবে আরম্ভ করার জন্য ব্যবহৃত হয়, এটি প্রথম মান নেয় (যা হয় 1) এবং এটি সেট করে a[0]। এটা যেমন int a[5] = { a[2] };থাকবে যেমন আমরা ইতিমধ্যে পেয়েছিলাম যেখানে a[2] = 1। ফলাফল অ্যারে এখন:1 0 1 0 0

আরেকটি উদাহরণ: int a[6] = { a[3] = 1, a[4] = 2, a[5] = 3 }; - যদিও আদেশটি কিছুটা নির্বিচারে, ধরে নিলেও এটি বাম থেকে ডানে চলে গেছে, এই 6 টি পদক্ষেপে এটি যাবে:

0 0 0 1 0 0
1 0 0 1 0 0
1 0 0 1 2 0
1 2 0 1 2 0
1 2 0 1 2 3
1 2 3 1 2 3

1
A = B = C = 5এটি কোনও ঘোষণা (বা আরম্ভ) নয়। এটি একটি সাধারণ অভিব্যক্তি যা পার্স করে A = (B = (C = 5))কারণ =অপারেটরটি সঠিক সহযোগী। সূচনাটি কীভাবে কাজ করে তা বোঝাতে এটি সত্যই সহায়তা করে না। এটি নির্ধারিত ব্লকটি প্রবেশ করানো হলে অ্যারেটি আসলে উপস্থিত শুরু হয় যা প্রকৃত সংজ্ঞা কার্যকর হওয়ার আগে দীর্ঘ হতে পারে।
মেলপোমেন

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

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

1
বিন্দু (1) -এর দৃ here়তা এখানে মূল প্রশ্নটির উপরে এক বিশাল লাফ: প্রাথমিক উপাদানটি a[2] = 1প্রকাশের পার্শ্ব প্রতিক্রিয়া প্রয়োগ করার আগেই [2] থেকে 0 মৌলের সংক্ষিপ্ত সূচনা ঘটে ? পর্যবেক্ষণের ফলাফলটি যেমন ছিল তেমন, তবে মানকটি নির্দিষ্ট হওয়া উচিত যা এটি হওয়া উচিত। এটিই বিতর্কের কেন্দ্রবিন্দু এবং এই উত্তরটি এটি সম্পূর্ণরূপে উপেক্ষা করে।
জন বলিঞ্জার

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

0

অ্যাসাইনমেন্টটি a[2]= 1একটি অভিব্যক্তি যার মান রয়েছে 1এবং আপনি মূলত লিখেছিলেন int a[5]= { 1 };(পাশাপাশি যে পার্শ্ব প্রতিক্রিয়াটিও a[2]নির্ধারিত 1হয়েছে)।


পার্শ্ব প্রতিক্রিয়াটি মূল্যায়ন করা হয় এবং সংকলকটির উপর নির্ভর করে আচরণটি পরিবর্তিত হতে পারে তা স্পষ্ট নয়। মানকটি দেখে মনে হয় যে এটি সংকলক নির্দিষ্ট উপলব্ধি সহায়ক নয় এমন আচরণের ব্যাখ্যা প্রদান করে making
বিদায় SE

@ কামিকাজে: নিশ্চিত, মান 1 দুর্ঘটনাক্রমে সেখানে পৌঁছেছে।
ইয়ভেস দাউস্ট

0

আমি বিশ্বাস করি, int a[5]={ a[2]=1 };একজন প্রোগ্রামার তাকে / নিজের পায়ে গুলি চালানোর জন্য এটি একটি উত্তম উদাহরণ।

আমি ভেবে প্রলোভিত হতে পারি যে আপনি int a[5]={ [2]=1 };যা বোঝাতে চেয়েছিলেন সেটি হ'ল একটি সি 99 মনোনীত ইনিশিয়ালাইজার সেটিং উপাদান 2 থেকে 1 এবং বাকীটি শূন্য হবে।

বিরল ক্ষেত্রে আপনি সত্যই বোঝাতে চেয়েছিলেন int a[5]={ 1 }; a[2]=1;তবে এটি এটি লেখার মজার উপায়। যাইহোক, আপনার কোডটি এটিকেই ফোটায়, যদিও কিছু এখানে উল্লেখ করেছেন যে লেখার a[2]আসলে সম্পাদন করার সময় এটি সঠিকভাবে সংজ্ঞায়িত হয়নি । এখানে সমস্যাটি হ'ল এটি a[2]=1কোনও মনোনীত আরম্ভকারী নয় বরং একটি সরল অ্যাসাইনমেন্ট যা নিজেই মান 1 করে।


দেখে মনে হচ্ছে এই ভাষা-আইনজীবির বিষয় স্ট্যান্ডার্ড খসড়া থেকে রেফারেন্স চাইছে is এজন্যই আপনি নিম্নচ্যুত (আপনি যেমন দেখেন আমি ততই নিম্নমানের হয়েছি বলে এটি করিনি)। আমি মনে করি আপনি যা লিখেছেন তা পুরোপুরি ঠিক আছে তবে এখানে এই সমস্ত ভাষা আইনজীবী কমিটির কাছ থেকে এসেছে বা এরকম কিছু। সুতরাং তারা কোনও সাহায্যের জন্য অনুরোধ করছে না তারা খতিয়ে দেখার চেষ্টা করছে যে খসড়াটি কেসটি কভার করে কিনা এবং এখানকার বেশিরভাগ ছেলেদের ট্রিগার করা হয় যদি আপনি তাদের সহায়তা করার মতো উত্তর দেন তবে। আমি অসুস্থ আমার উত্তর মুছতে অনুমান :) এই বিষয়ে নিয়ম করা তাহলে পরিষ্কারভাবে যে সহায়ক হতো
Abdurrahim
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.