কেন সি এবং সি ++ স্ট্রাক্টের মধ্যে অ্যারে সদস্যভিত্তিক অ্যাসাইনমেন্ট সমর্থন করে, তবে সাধারণত হয় না?


87

আমি বুঝতে পারি যে অ্যারে সদস্যপদভাবে অ্যাসাইনমেন্ট সমর্থিত নয়, যেমন নিম্নলিখিতগুলি কাজ করবে না:

int num1[3] = {1,2,3};
int num2[3];
num2 = num1; // "error: invalid array assignment"

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

তবে, নিম্নলিখিতটি কাজ করে:

struct myStruct { int num[3]; };
struct myStruct struct1 = {{1,2,3}};
struct myStruct struct2;
struct2 = struct1;

অ্যারেটি num[3]এর অনুসারে সদস্য হিসাবে নির্ধারিত হয়struct1 ইনস্টেন্সে অন্তর্ভুক্ত করা হয়েছে struct2

স্ট্রাইকগুলির জন্য অ্যারে সদস্যভিত্তিক কার্যনির্বাহী সহায়তা কেন, তবে সাধারণভাবে নয়?

সম্পাদনা : থ্রেডে রজার পেটের মন্তব্য স্টাড :: স্ট্রিং-এর স্ট্রিং - অনুলিপি / অ্যাসাইনমেন্ট সমস্যা? উত্তরের সাধারণ দিক নির্দেশ করে বলে মনে হচ্ছে, তবে আমি নিজে এটি নিশ্চিত করার জন্য যথেষ্ট জানি না।

সম্পাদনা 2 : অনেক দুর্দান্ত প্রতিক্রিয়া। আমি লুথার ব্লিসেটকে বেছে নিয়েছি কারণ আমি বেশিরভাগ আচরণের পিছনে দার্শনিক বা historical তিহাসিক যুক্তি নিয়ে ভাবছিলাম, তবে জেমস ম্যাকনেলিস সম্পর্কিত সম্পর্কিত ডকুমেন্টেশনের উল্লেখটিও কার্যকর ছিল।


6
আমি এটি ট্যাগ হিসাবে সি এবং সি ++ উভয়ই তৈরি করছি, কারণ এটি সি থেকে উত্পন্ন, এছাড়াও ভাল প্রশ্ন।
GManNickG

4
এটি লক্ষণীয় যে আপনি অনেক আগে সিতে কাঠামোগত কার্যভারটি সাধারণত সম্ভব ছিল না এবং আপনাকে এটি ব্যবহার করতে memcpy()বা অনুরূপ করতে হয়েছিল।
ggg

কেবলমাত্র একটু এফওয়াইআই ... boost::array( boost.org/doc/libs/release/doc/html/array.html ) এবং এখন std::array( en.cppreferences.com/w/cpp/container/array ) হল এসটিএল-সামঞ্জস্যপূর্ণ বিকল্প অগোছালো পুরানো সি অ্যারে। তারা অনুলিপি-অ্যাসাইনমেন্ট সমর্থন করে।
এমিল কর্মিয়ার

@ এমিলিক কর্মির এবং তারা - টাদা! - অ্যারে প্রায় কাঠামো।
পিটার - মনিকা

উত্তর:


46

এটি আমার গ্রহণ করা এখানে:

সি ভাষার বিকাশ সিটিতে অ্যারের ধরণের বিবর্তনে কিছুটা অন্তর্দৃষ্টি দেয়:

আমি অ্যারে জিনিসটির রূপরেখা দেওয়ার চেষ্টা করব:

সি এর অগ্রদূত বি এবং বিসিপিএলের কোনও আলাদা অ্যারে টাইপ ছিল না, যেমন একটি ঘোষণা:

auto V[10] (B)
or 
let V = vec 10 (BCPL)

ভি কে একটি (অপ্রচলিত) পয়েন্টার হিসাবে ঘোষণা করবে যা মেমরির 10 "শব্দের" অব্যবহৃত অঞ্চলে নির্দেশ করার জন্য সূচনা করা হয়েছিল। বি ইতিমধ্যে *পয়েন্টার ডেরিফারেন্সিংয়ের জন্য ব্যবহৃত হয়েছিল এবং তার [] হাতে সংক্ষিপ্ত স্বরলিপি ছিল, যার *(V+i)অর্থ V[i], আজ যেমন সি / সি ++ তে রয়েছে। যাইহোক, Vএকটি অ্যারে নয়, এটি এখনও একটি পয়েন্টার যা কিছু স্মৃতিতে নির্দেশ করতে পারে। ডেনিস রিচি যখন স্ট্রাক্ট প্রকারের সাথে বি প্রসারিত করার চেষ্টা করেছিলেন তখন এটি সমস্যার কারণ হয়েছিল। তিনি চেয়েছিলেন যে অ্যারেগুলি আজকের মতো সিটির মতো স্ট্রাইকগুলির অংশ হতে পারে:

struct {
    int inumber;
    char name[14];
};

কিন্তু বি, বিসিপিএল অ্যারেগুলির পয়েন্টার হিসাবে ধারণার সাথে, nameক্ষেত্রটির একটি পয়েন্টার থাকতে হবে যা রানটাইমের সময় কাঠামোর মধ্যে 14 বাইটের একটি মেমরি অঞ্চলে আরম্ভ করতে হবে । শুরুতে / বিন্যাসের সমস্যাটি শেষ পর্যন্ত অ্যারেগুলিকে একটি বিশেষ চিকিত্সা দিয়ে সমাধান করা হয়েছিল: সংকলকটি কাঠামোর মধ্যে অ্যারেগুলির অবস্থানগুলি স্ট্যাকের উপর ইত্যাদি সন্ধান করবে would এই চিকিত্সা প্রায় সমস্ত বি কোড এখনও চালানোর অনুমতি দেয় এবং "অ্যারে পয়েন্টারে রূপান্তর যদি আপনি তাদের তাকান" এর উত্স নিয়মটির । এটি একটি সামঞ্জস্যতা হ্যাক, যা খুব সহজ বলে প্রমাণিত হয়েছিল, কারণ এটি খোলার আকারের অ্যারে ইত্যাদির অনুমতি দেয় etc.

এবং এখানে আমার অনুমান কেন অ্যারে নির্ধারিত করা যায় না: যেহেতু অ্যারে বি তে পয়েন্টার ছিল, আপনি কেবল লিখতে পারেন:

auto V[10];
V=V+5;

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

/* Example how array assignment void make things even weirder in C/C++, 
   if we don't want to break existing code.
   It's actually better to leave things as they are...
*/
typedef int vec[3];

void f(vec a, vec b) 
{
    vec x,y; 
    a=b; // pointer assignment
    x=y; // NEW! element-wise assignment
    a=x; // pointer assignment
    x=a; // NEW! element-wise assignment
}

1978-এ সি এর একটি সংশোধন স্ট্রাক্ট অ্যাসাইনমেন্ট যোগ করার সময় এটি পরিবর্তন হয়নি ( http://cm.bell-labs.com/cm/cs/Wo/dmr/cchanges.pdf )। যদিও রেকর্ড ছিল স্বতন্ত্র ধরনের সি, এটা তাদের প্রাথমিক কে & R এর সি আপনি দায়িত্ব অর্পণ করা সম্ভব নয় অনুলিপি করতে ছিল তাদের সদস্য-অনুযায়ী আমার মনে সঙ্গে এবং আপনার ফাংশন পরামিতি তাদের একমাত্র পয়েন্টার পাস পারে। অ্যাসিগমেন্ট (এবং প্যারামিটার পাসিং) এখন কেবল স্ট্রাক্টের কাঁচা মেমরির মেমকি হিসাবে সংজ্ঞায়িত হয়েছিল এবং যেহেতু এটি অস্তিত্বের কোডটি ভাঙতে পারেনি এটি সহজেই যুক্তিযুক্ত হয়েছিল। অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া হিসাবে, এটি সুস্পষ্টভাবে কিছু ধরণের অ্যারে নিয়োগের সাথে পরিচয় করিয়ে দেয় তবে এটি কাঠামোর অভ্যন্তরে কোথাও হতাশ হয়, সুতরাং এটি অ্যারেগুলি যেভাবে ব্যবহৃত হয়েছিল তা নিয়ে সমস্যাটি প্রকৃতপক্ষে প্রবর্তন করতে পারেনি।


এটি খুব খারাপ সি কোনও সিনট্যাক্সের সংজ্ঞা দেয় না যেমন int[10] c;ল্যাভেলুকে cদশ-আইটেম অ্যারের প্রথম আইটেমের পয়েন্টার হিসাবে না করে দশ আইটেমের অ্যারে হিসাবে আচরণ করে। কয়েকটি পরিস্থিতি রয়েছে যেখানে কোনও টাইডেফ তৈরি করতে সক্ষম হওয়া কার্যকর যা ভেরিয়েবলের জন্য ব্যবহার করার সময় স্থান বরাদ্দ করে, তবে একটি ফাংশন আর্গুমেন্ট হিসাবে ব্যবহৃত হলে পয়েন্টারটি পাস করে তবে অ্যারের ধরণের মান না পাওয়ার অক্ষমতা একটি উল্লেখযোগ্য শব্দার্থক দুর্বলতা ভাষায়।
সুপারক্যাট

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

ইতিহাসের একটি দুর্দান্ত সংক্ষিপ্তসার জন্য অ্যারেগুলিতে সি'র বিদ্বেষ দেখুন ।
পিটার কর্ডেস

31

অ্যাসাইনমেন্ট অপারেটরদের বিষয়ে, সি ++ স্ট্যান্ডার্ড নিম্নলিখিতটি বলে (সি ++ 03 §5.17 / 1):

বেশ কয়েকটি এসাইনমেন্ট অপারেটর রয়েছে ... সকলের বাম অপারেন্ড হিসাবে একটি সংশোধনযোগ্য লভ্যালু প্রয়োজন

একটি অ্যারে কোনও পরিবর্তনযোগ্য মূল্য নয়।

যাইহোক, একটি শ্রেণির ধরণের অবজেক্টের জন্য নিয়োগটি বিশেষভাবে সংজ্ঞায়িত করা হয় (§5.17 / 4):

কোনও শ্রেণীর অবজেক্টগুলিকে অর্পণ করা অনুলিপি করা হয় অনুলিপি অপারেটর দ্বারা।

সুতরাং, আমরা কোন শ্রেণীর জন্য সুস্পষ্টভাবে ঘোষিত অনুলিপি অপারেটর অপারেটর কী করে তা দেখতে সন্ধান করব (12.8 / 13):

দশম শ্রেণির জন্য অন্তর্নিহিত সংজ্ঞায়িত অনুলিপি অপারেটর অপারেটর এর সাবওবজেক্টগুলির সদস্যপদযুক্ত কার্য সম্পাদন করে। ... প্রতিটি সাবোবজেক্টটি তার প্রকারের জন্য উপযুক্তভাবে নির্ধারিত হয়:
...
- যদি সাবোবজেক্টটি একটি অ্যারে হয় তবে প্রতিটি উপাদানকে উপাদান টাইপের সাথে উপযুক্তভাবে নির্ধারিত করা হয়
...

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


সি (সি 99 §6.5.16 / 2) এ যুক্তিটি একই রকম:

একটি অ্যাসাইনমেন্ট অপারেটরের বাম অপারেণ্ডের মতো একটি মডেল-সক্ষম লভ্যালু থাকতে হবে।

এবং .36.3.2.1 / 1:

একটি মোডি-সক্ষম লভ্যালু এমন একটি লভ্যালু যা অ্যারের ধরণের হয় না ... [অন্যান্য সীমাবদ্ধতাগুলি অনুসরণ করে]

সি-তে, অ্যাসাইনমেন্ট সি ++ (§6.5.16.1 / 2) এর চেয়ে অনেক সহজ:

সরল অ্যাসাইনমেন্টে (=), ডান অপরেন্ডের মান অ্যাসাইনমেন্ট এক্সপ্রেশনের ধরণে রূপান্তরিত হয় এবং বাম অপারেন্ড দ্বারা মনোনীত অবজেক্টে সঞ্চিত মানকে প্রতিস্থাপন করে।

স্ট্রাক্ট-টাইপ অবজেক্টের অ্যাসাইনমেন্টের জন্য, বাম এবং ডান অপারেন্ডগুলির অবশ্যই একই ধরণের থাকতে হবে, তাই ডান অপরেন্ডের মানটি কেবল বাম অপারেন্ডে অনুলিপি করা হয়।


4
অ্যারেগুলি অপরিবর্তনীয় কেন? বা বরং, অ্যাসাইনমেন্টটি শ্রেণির ধরণের ক্ষেত্রে যেমন হয় ঠিক তেমন অ্যারেগুলির জন্য কেন তাকে সংজ্ঞায়িত করা হয় না?
GManNickG

4
@ জিএমান: এটি আরও আকর্ষণীয় প্রশ্ন, তাই না। সি ++ এর জন্য উত্তরটি সম্ভবত "কারণ এটি সি তে কীভাবে", এবং সি এর জন্য, আমি অনুমান করতে পারি যে ভাষাটি কীভাবে বিকশিত হয়েছিল (যেমন, কারণটি historicalতিহাসিক, প্রযুক্তিগত নয়) তবে আমি জীবিত ছিলাম না যখন বেশিরভাগ স্থান নিয়েছে, তাই আমি এই অংশটির উত্তর দেওয়ার জন্য আরও জ্ঞানী কারও কাছে রেখে দেব :- পি (এফডাব্লুআইডাব্লু, আমি সি 90 বা সি 99 যুক্তির দলিলগুলিতে কিছুই খুঁজে পাচ্ছি না)।
জেমস ম্যাকনেলিস

4
"মোডিফাইয়েবল লভালু" এর সংজ্ঞাটি সি ++ 03 স্ট্যান্ডার্ডে রয়েছে এমন কি কেউ জানেন? এটি §3.10 এর মধ্যে হওয়া উচিত । সূচক বলছে যে এটি পৃষ্ঠাটিতে সংজ্ঞায়িত হয়েছে, তবে তা নয়। §8.3.4 / 5-তে (অ-আদর্শিক) নোটটিতে বলা হয়েছে "অ্যারের ধরণের অবজেক্টগুলি সংশোধন করা যায় না, দেখুন 3.10," তবে .3.10 একবার "অ্যারে" শব্দটি ব্যবহার করে না।
জেমস ম্যাকনেলিস

@ জেমস: আমি ঠিক একই কাজ করছিলাম। এটি মুছে ফেলা সংজ্ঞাটি বলে মনে হচ্ছে। এবং হ্যাঁ, আমি সবসময় এর পেছনের আসল কারণটি জানতে চেয়েছি তবে এটি একটি রহস্য বলে মনে হচ্ছে। আমি "দুর্ঘটনাক্রমে অ্যারেগুলি অর্পণ করে লোককে অকার্যকর হতে বাধা" র মতো জিনিস শুনেছি, তবে এটি হাস্যকর।
GManNickG

4
@GMan, জেমস আছে: সম্প্রতি comp.lang.c ++, আলোচনা ছিল groups.google.com/group/comp.lang.c++/browse_frm/thread/... যদি আপনি এটি মিস এবং এখনও আগ্রহী। স্পষ্টতই এটি এর কারণ নয় যে অ্যারেটি কোনও সংশোধনযোগ্য লভ্যালু নয় (একটি অ্যারে অবশ্যই একটি লভ্যালু এবং সমস্ত অ-কনস্ট্যান্ট ল্যাভেলুগুলি সংশোধনযোগ্য) তবে কারণ আরএইচএসের উপর =একটি মূল্য প্রয়োজন এবং একটি অ্যারে কোনও মূল্যায়ন হতে পারে না ! ল্যাভেলু-টু-রালভ্য রূপান্তর অ্যারেগুলির জন্য নিষিদ্ধ, লভ্যু-টু-পয়েন্টার দ্বারা প্রতিস্থাপিত। কোনও মূল্যবোধ তৈরির চেয়ে ভাল নয় কারণ এটি একই পদে সংজ্ঞায়িত হয়েছে। static_cast
পোটোটোওয়াতর

2

এই লিঙ্কে: http://www2.research.att.com/~bs/bs_faq2.html অ্যারে অ্যাসাইনমেন্টের একটি বিভাগ রয়েছে:

অ্যারেগুলির সাথে দুটি মূল সমস্যা হ'ল

  • একটি অ্যারের নিজস্ব আকার জানে না
  • সামান্য উস্কানিতে একটি অ্যারের নাম একটি পয়েন্টারে রূপান্তরিত করে তার প্রথম উপাদানকে

এবং আমি মনে করি এটি অ্যারে এবং স্ট্রাক্টের মধ্যে মৌলিক পার্থক্য। একটি অ্যারে ভেরিয়েবল হ'ল সীমিত স্ব-জ্ঞানের সাথে একটি নিম্ন স্তরের ডেটা উপাদান। মূলত, এটি মেমরির একটি অংশ এবং এটিতে সূচকের এক উপায়।

সুতরাং, সংকলকটি int a [10] এবং int b [20] এর মধ্যে পার্থক্য বলতে পারে না।

স্ট্রাক্টগুলির মধ্যে একই রকম অস্পষ্টতা নেই।


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

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

4
সংকলকটি দুটি ভিন্ন আকারের অ্যারের মধ্যে পার্থক্য বলতে পারে - sizeof(a)বনাম প্রিন্ট করার sizeof(b)বা পাস aকরার চেষ্টা করুন void f(int (&)[20]);
জর্জি ফ্রিজচে

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

0

আমি জানি, যারা উত্তর দিয়েছে তারা সবাই সি / সি ++ এর বিশেষজ্ঞ। তবে আমি ভেবেছিলাম, এটিই প্রাথমিক কারণ।

num2 = num1;

এখানে আপনি অ্যারের বেস ঠিকানাটি পরিবর্তন করার চেষ্টা করছেন যা অনুমোদিত নয়।

এবং অবশ্যই, কাঠামো = কাঠামো 1;

এখানে অবজেক্ট স্ট্রাক্ট 1 অন্য একটি বস্তুকে বরাদ্দ করা হয়েছে।


এবং স্ট্রাক্ট বরাদ্দকরণ শেষ পর্যন্ত অ্যারে সদস্যকে অর্পণ করবে, যা সঠিক একই প্রশ্নটি গ্রহণ করে। একজনকে কেন অনুমতি দেওয়া হয় এবং অন্যটি নাও হয়, যখন এটি উভয় পরিস্থিতিতেই অ্যারে?
GManNickG

4
রাজি। তবে প্রথমটি সংকলক (num2 = num1) দ্বারা প্রতিরোধ করা হয়েছে। দ্বিতীয়টি সংকলক দ্বারা প্রতিরোধ করা হয়নি। এটি একটি বিশাল পার্থক্য করে।
nsivakr

অ্যারে যদি নির্ধারিত হয় num2 = num1তবে পুরোপুরি ভাল আচরণ করা হবে। এর উপাদানগুলির সাথে num2সংশ্লিষ্ট উপাদানের একই মান থাকবে num1
জুয়ানচোপাঞ্জা

0

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

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

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