ভেরিয়েবল ঘোষণার সময় কেন সি ++ আমাদের প্রথম বন্ধনীতে চলক নাম ঘিরে রাখার অনুমতি দেয়?


84

উদাহরণস্বরূপ যেমন একটি ঘোষণা:

int (x) = 0;

বা এমনকি:

int (((x))) = 0;

আমি এটিকে হোঁচট খেয়েছি কারণ আমার কোডে আমার সাথে নিম্নলিখিত অংশের মতো একটি খণ্ড রয়েছে:

struct B
{
};

struct C
{
  C (B *) {}
  void f () {};
};

int main()
{
  B *y;
  C (y);
}

স্পষ্টতই আমি অবজেক্টটি নির্মাণ করতে চেয়েছিলাম Cযা তার ধ্বংসকারীটিতে কার্যকর কিছু করতে পারে। তবে এটি ঘটনার সাথে সাথে সংকলকটি প্রকারের সাথে C (y);ভেরিয়েবলের ঘোষণা হিসাবে আচরণ করে এবং এটি পুনরায় সংজ্ঞা সম্পর্কে একটি ত্রুটি মুদ্রণ করে । মজার বিষয় হ'ল আমি যদি এটি লিখি বা এটির মতো কিছু লিখতে চাইলে সংকলিত করে দেই। কনস্ট্রাক্টর কলটিতে অবশ্যই সবচেয়ে ভাল আধুনিক কার্যকারিতা ব্যবহার করা।yCyC (y).f ()C (static_cast<B*> (y)){}

সুতরাং আমি এটির পরে যেমনটি বের করেছি, ভেরিয়েবলগুলি int (x) = 0;এমনকি বা এমনকি ঘোষণা করা সম্ভব int (((x))) = 0;তবে বাস্তবে আমি এর আগে কখনও কাউকে দেখিনি। সুতরাং আমি আগ্রহী - এই ধরনের সম্ভাবনার উদ্দেশ্য কী? কারণ আপাতত আমি দেখতে পাচ্ছি যে এটি কেবল কুখ্যাত "মোস্ট ভেক্সিং পার্স" এর মতোই কেসটি তৈরি করে এবং দরকারী কিছু যুক্ত করে না?


সম্ভাবনার "উদ্দেশ্য" সম্ভবত পার্সারটিকে সহজতর করা।
molbdnilo


4
@ জিসার্গ ফানি কীভাবে আমার প্রশ্নের পাঠ্যটি আপনার লিঙ্কযুক্ত প্রশ্নের দ্বিতীয় উত্তর থেকে প্রশ্নের উত্তর দেয়, যেহেতু আমি উদাহরণ প্রদান করি যেখানে এই জাতীয় ঘোষণাকে অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যায় :)
প্রেডেলনিক


এই ফাঁদে পা দিয়েছিলেন: জানেন না ম্বেটেক্সকে মন্তব্য করা হয়েছিল এবং তারপরে দুর্ঘটনাক্রমে ভুল বন্ধনী ঘোষণাটি লিখেছিলেন। // স্টাডি :: মিউটেক্স স্টাডি :: অনন্য_লক <স্টাডি :: মিটেক্স> (এম_মুটেক্স);
লরিজসসেন

উত্তর:


80

দলবদ্ধকরণ।

একটি বিশেষ উদাহরণ হিসাবে, বিবেচনা করুন যে আপনি যেমন ফাংশন ধরণের একটি পরিবর্তনশীল ঘোষণা করতে পারেন

int f(int);

এখন, আপনি কীভাবে এই জাতীয় বিষয়টির জন্য একটি পয়েন্টার ঘোষণা করবেন?

int *f(int);

না, কাজ করে না! এটি ফাংশন রিটার্ন হিসাবে ব্যাখ্যা করা হয় int*। এটিকে সঠিক উপায়ে পার্স করার জন্য আপনার প্রথম বন্ধনী যুক্ত করতে হবে:

int (*f)(int);

অ্যারেগুলির সাথে একই চুক্তি:

int *x[5];   // array of five int*
int (*x)[5]; // pointer to array of five int

13
এবং উত্তরটি সম্পূর্ণ করার জন্য: প্রশ্নকর্তা যে বিশেষ কেস সম্পর্কে জিজ্ঞাসা করছেন তা অস্বীকার করার জন্য অতিরিক্ত বিশেষ-মামলার বিধি প্রয়োজন। ()কোনও প্রকারে কীভাবে কাজ করা যায় তার বর্তমান সংজ্ঞা প্রকারভেদে সমান।
জোসেফ ম্যানসফিল্ড

সুতরাং বিশেষ ক্ষেত্রে সর্বাধিক ভেক্সিং পার্সের ক্ষেত্রে প্রযোজ্য। এটি কারণ কারণ কনস্ট্রাক্টর আর্গুমেন্টের সাথে ভেরিয়েবল সূচনা করার সিনট্যাক্সটি পরে যুক্ত করা হয়েছিল (তাড়াতাড়ি আমার অনুমান?)।
AnArrayOfFunitions 14

4
@FISOCPP ভাল আছে। । হ্যাঁ. সি ++ সি পরে এসেছিল। ।
iheanyi

এই উত্তরটি কি কেবল সি ++ নয়, সমানভাবে প্রযোজ্য?
kdbanman

" ফাংশন টাইপের ভেরিয়েবল " কি? !!
কৌতূহলী

17

এই জাতীয় ঘোষণায় সাধারণত বন্ধনী ব্যবহারের অনুমতি দেওয়া হয় কারণ সিনট্যাক্টিকাল দৃষ্টিকোণ থেকে ঘোষণাটি সর্বদা এরকম দেখায়:

<front type> <specification>;

উদাহরণস্বরূপ, নিম্নলিখিত ঘোষণায়:

int* p[2];

"সামনের প্রকার" হ'ল int(নয় int*) এবং "স্পেসিফিকেশন" * p[2]

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

int* p[2]; // array of 2 pointers to int; same as int (*p[2]);
int (*p)[2]; // pointer to an array of 2 ints

একটি অ্যারেতে নির্দেশকটি বিরল ক্ষেত্রে, তবে পয়েন্টারের সাথে কাজ করার মতো একই অবস্থা:

int (*func(int)); // declares a function returning int*
int (*func)(int); // declares a pointer to function returning int

এটি আপনার প্রশ্নের সরাসরি উত্তর। আপনার প্রশ্নটি যদি বিবৃতি সম্পর্কে হয় C(y)তবে এরকম :

  • পুরো এক্সপ্রেশনটির চারদিকে বন্ধনী রাখুন - (C(y))এবং আপনি যা চান তা পাবেন
  • এই বিবৃতিটি একটি অস্থায়ী অবজেক্ট তৈরি করা ব্যতীত কিছুই করে না, যা এই নির্দেশনা শেষ হওয়ার পরে জীবনযাপন বন্ধ করে দেয় (আমি আশা করি এটি আপনি যা করার ইচ্ছা করেছিলেন)।

4
যেমনটি আমি উল্লেখ করেছি, প্রাথমিকভাবে এটি ডেস্ট্রাক্টরে কিছু করছিল, আমি অনুমান করি এটি বেশ মানক জিনিস যখন আপনার কাছে কিছু প্যারামিটার সেট করার জন্য কয়েকটি "চেইনিং" ফাংশন থাকে এবং তারপরে ডেস্ট্রাক্টরে সমস্ত কাজ করা হয়। আরও একটি কাজের জন্য ধন্যবাদ যদিও, আমি অনুমান করি যে লেখাগুলি {}সর্বোপরি বৈধ এক।
প্রেজেলনিক

4
আপনার নিজস্ব ব্যাকরণ তৈরি করা এড়াতে চেষ্টা করুন এবং মান হিসাবে প্রদত্ত একটি ব্যবহার করুন। <front-type> <specification>বিভ্রান্তিকর, এবং ভুল। ব্যাকরণটি হল<declaration-specifier> <declarator>
স্টিভ কক্স

আপনি ঠিক বলেছেন - আমি মানটি সন্ধান করিনি, কেবল আমার মাথা থেকে নিয়মটি পুনরাবৃত্তি করলাম। আসলে সি ++ 11 এ কীওয়ার্ড <declaration-specifier>দ্বারাও ভূমিকা নেওয়া যেতে পারে auto, সুতরাং এটি সর্বদা কোনও ধরণেরও হয় না।
ইথুরিস

@ প্রবাসী মিলিত: আপনি যদি আমার পোস্টের অংশটি সম্পাদনা করে প্রদত্ত সিনট্যাক্স স্কিমায় নাম পরিবর্তন করে থাকেন তবে দয়া করে নীচে 3 লাইন নামগুলিও পরিবর্তন করুন। অন্যথায় এখনও পুরানো নামগুলি "সামনের ধরণ" এবং "স্পেসিফিকেশন" রয়েছে এবং তাই পোস্টটির কোনও অর্থ হয় না।
ইথুরিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.