int * i; বা ইনট * আমি; বা ইনট * আমি; [বন্ধ]


30

পয়েন্টার ঘোষণার জন্য আপনার প্রিয় পদ্ধতিটি কী?

int* i;

অথবা

int *i;

অথবা

int * i;

অথবা

int*i;

কেন দয়া করে ব্যাখ্যা করুন।

আরও দেখুন: http://www.stroustrup.com/bs_faq2.html#Witespace


19
আমি অন্যদের 3000 লাইনে ফোকাস করতে পছন্দ করব ...

29
int*i;- গাছে সাদা জায়গা বৃদ্ধি পায় না, আপনি জানেন ...
শোগ 9


উত্তর:


75

আপনি যদি লিখেন:

int* i, j, k;

আপনি বিভ্রান্তিকরভাবে পরামর্শ দিচ্ছেন যে i, j এবং k এর সমস্তগুলিই নির্দেশক int

সুতরাং আমি দাবি করছি যে এটি * পরিবর্তনশীল নামের সাথে সংযুক্তি করা থেকে শ্রেষ্ঠ।


35
এবং আমি প্রস্তাব দিচ্ছি যে int * i;এটি কোনও প্রতিযোগী নয়, কারণ এটি দ্রুত নজরে গুণনের মতো।
জন কে

1
+1 কারণ আমি এই দৃশ্যটি আগে বিবেচনা করি নি।
পপ

4
"আপনি বিভ্রান্তিমূলকভাবে পরামর্শ দেন যে i, j এবং k এর সমস্তগুলিই আন্তঃকে নির্দেশক" " আপনি যদি সি # লিখছেন না, যেখানে int*প্রকার হিসাবে দেখা হয় এবং int* i, jদুটি পয়েন্টার ঘোষণা করে না। প্রশ্নটি অসম্পূর্ণ হিসাবে বিবেচিত হতে পারে - এটি আপনি যে ভাষাটি ব্যবহার করছেন তার উপর নির্ভর করে কোন স্টাইল যুক্তিসঙ্গত। সিআই অনুসরণ করে int *x, সি # এ আমি অন্যথায় করি।
জোরেেন

1
@ জোরেন: দুঃখিত, সি # প্রোগ্রামার না হয়ে, আমি প্রশ্নটির কোড টুকরাটি কেবল সি বা সি ++ দেখে কেবল অনুধাবন করেছি।
র‌্যান্ডাল স্কুল্জ

আমি এটি পুরোপুরি যুক্তিসঙ্গত বলে মনে করি যে এটির সি বা সি ++ সুনির্দিষ্টভাবে উল্লেখ করা হয়নি যদি না # কেউ সি # তে পয়েন্টার খুব প্রায়ই দেখতে পায় না।
বিকল্পটি

62

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


8
আমিও এই সম্মেলনটি অনুসরণ করি। একই কারণে।
গ্যাবলিন

5
ব্যক্তিগতভাবে, আমি যদি আমার কোডে একাধিক পয়েন্টার ঘোষণা করি তবে আমি এটিকে কোড গন্ধ হিসাবে বিবেচনা করি। আমার এমন অনেক পয়েন্টার দরকার নেই; এবং সাধারণত, আমি না। সুতরাং আমি একটি লিখিত একাধিক ঘোষণার বিষয়টি কখনই লিখি না যে কোনও কোডেই লিখি: প্রতি লাইনে একটি ঘোষণা।
গ্রেফ্যাড

5
এটির সাথে সমস্যাটি হ'ল ধরণটি "কোনও ইন্টির পয়েন্টার" নয়। সি (এবং সি ++) এর পয়েন্টার প্রকার নেই। এটি মেমরির একটি ব্লকের পয়েন্টার, যার মধ্যে টাইপ ইন্ট।
বিলি ওনিল

10
আমি তর্ক করব যে *iএকটি ধরণের আছে int
টিম গুডম্যান

5
@ বিলি: যদি তাই হয় তবে আমি স্ট্যান্ডার্ডিজ বোঝার, পার্স করার এবং ব্যাখ্যা করার 12 বছরের মধ্যে এই বিভ্রান্তিটি কখনও দেখিনি। "পয়েন্টার টু ইন ইন্ট" সি এবং সি ++ এর মধ্যে একেবারে বৈধ টাইপ।

23

সি এর জন্য, যেখানে আমাদের ধরণের উপর দৃ strong় মনোনিবেশ নেই, আমি পছন্দ করি:

int *i;

কারণ এটিতে একটি জোর রয়েছে int, পয়েন্টারটি নয়। কি int? *iঅন্তর্নিহিত হয়।


2
ভাল যুক্তি. পয়েন্টারগুলির সাহায্যে আপনি শুরুটিকে নামের অংশ হিসাবে ভাবতে পারেন। উদাহরণস্বরূপ, যদি আপনার int i = 5মান থাকে i, আপনি নামটি ব্যবহার করেন i। অনুরূপভাবে, যদি আপনার কাছে থাকে int *i; *i = 5তবে মানটি পেতে, আপনি ব্যবহার করুন *i
মিপাদি

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

এই কারণে আমি মনে করি তারা পরিবর্তনশীলের পাশে * লিখতে পছন্দ করেছে, কারণ * এটিতে প্রয়োগ করা অপারেটর।
জর্জিও

7

আমি int* iবছরের পর বছর ধরে পছন্দ করেছি । তবে এর জন্য একটি শক্ত যুক্তি রয়েছে int *iকারণ পূর্ববর্তী শৈলীটি ব্যবহার করার সময়, আপনাকে এখনও একাধিক ঘোষণার নিয়মটি মনে রাখতে হবে:

int* a, *b; // not int* a, b;

কারণ আপনাকে অবশ্যই এই নিয়মটি মনে রাখতে হবে, আপনি কোনও সহজভাবে লাভ করতে পারেন না — তবে আমি এটি আরও জটিল বলব না। আপনি এই নিয়মটি মনে রেখেছেন বলে এক লাইনে একাধিক ঘোষণাকে এড়িয়ে যাওয়া another দুটি শৈলীর মধ্যে পার্থক্যটি মোট oot

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

আমি কিনতে না মধ্যে যে এক জোর দেয় (জন্য পয়েন্টার টাইপ i) যখন অন্যান্য (জন্য int- এ টাইপ উপর জোর দেয় *i), কিন্তু যে হতে পারে সি এবং সি ++ ব্যবহারের 15 বছর পর, এটা ঠিক যে হয় যখন আমি এটি তাকান ছাড়া এটি সম্পর্কে চিন্তাভাবনা করা most most এই প্রশ্নটি জিজ্ঞাসা করা বেশিরভাগ প্রাথমিকের এখনও কিছু করতে পারে না।

এছাড়াও, এমনকি আমার পছন্দ অনুসারে, আমি অন্য স্টাইলে কোড পড়তে / লিখতে অসুবিধে পাই না। ধারাবাহিকতা, ব্লে ব্লা ব্লা।

এমনকি উল্লেখ করার প্রয়োজন নেই int * i


6

আমি প্রথমটিকে পছন্দ করি। এটি স্বাভাবিক হিসাবে আসে কারণ এটি পয়েন্টার হওয়া টাইপের অংশ।

যেহেতু আমি সি # ব্যবহার করি, এটি সি এর চেয়ে আরও স্বজ্ঞাত উপায়ে প্রকারগুলি পরিচালনা করে, সুতরাং একই বিবৃতিতে বেশ কয়েকটি পয়েন্টার ঘোষণা করতে কোনও সমস্যা নেই:

int* a, b, c; // three pointers

5

আমি পছন্দ করি int* i(সি ++ - শৈলী)
ফলস্বরূপ চাক্ষুষ অস্পষ্টতা ( int* i, j) এর কারণে আমি এক বিবৃতিতে একাধিক ভেরিয়েবল ঘোষণা করা এড়াতে পারি ।

যৌক্তিকতার জন্য বার্জন স্ট্রস্ট্রপের সি ++ স্টাইল এবং টেকনিকের এফএকিউও দেখুন ।


4

আপনি যদি একাধিক ভেরিয়েবল ঘোষনা করতে চান তবে তারকাচিহ্নটি পুনরাবৃত্তি করতে না চান:

template <typename T>
struct pointer_to
{
    typedef T* type;
};

pointer_to<int>::type p1, p2, p3;

(আপনি যেমন স্ট্রাক্ট টেম্পলেটটির ভিতরে দেখতে পারেন, আমি int* iশৈলীর পছন্দ করি ))

এবং এখানে আরও সাধারণ সমাধান:

template <typename T>
struct identity
{
    typedef T type;
};

identity<int*>::type p1, p2, p3;

এটি কোনও "সমস্যাযুক্ত ধরণের" সাথে কাজ করে, উদাহরণস্বরূপ অ্যারে এবং রেফারেন্স:

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);

ওএমজি, সি ++ সবসময় আমার কাছে নতুন কিছু দেখায় :)। ধন্যবাদ!
ট্যামস সেজেলি

1
ওএমজি, সি ++ ভয়ঙ্কর! typedef int* int_ptrকৌতুকটি করত অবশ্যই, আমাকে বিভিন্ন পয়েন্টার ধরণের জন্য একটি নতুন টাইপিডেফ ঘোষণা করতে হবে, তবে বাস্তবে এটি কতটি হবে? সবচেয়ে বেশি আট?
বেনজাদো

1
@ বেনজাদো বাস্তবে, আপনার টাইপয়েফ বা আমি যে অভিনব কৌশল দেখিয়েছি তার দরকার নেই, কারণ কোনও বুদ্ধিমান ব্যক্তি এক লাইনে একাধিক ভেরিয়েবল ঘোষণা করে না। এখনও আকর্ষণীয়, যদিও।
ফ্রেডওভারফ্লো

2
আমি জানি, আমি সি ++ প্রোগ্রামগুলির ভাষার বৈশিষ্ট্যগুলি কেবলমাত্র সেগুলির কারণে ব্যবহার করার প্রবণতার সাথে আরও কথা বলছিলাম।
বেনজাদো

@ বেনজাদো: !!! আমি এতবার দেখেছি!
জর্জিও

2

int* i;প্রথম অংশটি চলক প্রকার (পয়েন্টার টু ইনট) নির্দেশ করে অন্যদিকে দ্বিতীয় অংশটি ( i) নির্দেশ করে I'd এটি টাইপ intএবং নামটি আমার কাছে বোধগম্য হবে না *i। এছাড়াও, int * i;আমার কাছে কিছুটা গুণকের মতো দেখাচ্ছে।


সি ডিক্লেয়ারেশন সিনট্যাক্স এ ক্ষেত্রে সামঞ্জস্যপূর্ণ নয়, কারণ প্রকারের তথ্য সহজেই শনাক্তকারীর পরে আসতে পারে: অ্যারেগুলি সবচেয়ে পরিষ্কার উদাহরণ।

@ রোজার: আমি জানি, তবে এই প্রশ্নটি বিশেষত একক পরিবর্তনশীল ঘোষণার বিষয়ে ছিল এবং অন্য কিছুই নয়।
অ্যালন গুরালেনেক

আমি মনে করি এটি এতে কিছুটা পড়ছে। :) আমি প্রশ্নটি যেভাবে বুঝি, আপনি কোথাও কোন স্টাইল ব্যবহার করেন তা জিজ্ঞাসা করছে।

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

2

আমি যে ঘোষণাগুলি ব্যবহার করি int * i;তাতে আপনি এটি পড়েন i is a pointer to an integer

পয়েন্টারটি প্রকার এবং ভেরিয়েবল উভয় ক্ষেত্রে অবদান রাখে তাই এটি মাঝখানে হওয়া উচিত।

একই লাইনে একাধিক জিনিস ঘোষণা করা এড়ানো ভাল কাজ: int * i, j;


1

আমি আসলে তিনটি কনভেনশন নির্দিষ্ট পরিস্থিতিতে ব্যবহার করি। প্রথম নজরে আমি বেমানান বলে মনে করি, তবে ...

  • int * শনাক্তকারী উপস্থিত না থাকলে, দৃশ্যমানভাবে বল প্রয়োগ করতে নামটি উপস্থিত নেই।
  • int* intptrউপর typedefগুলি এবং অনুরূপ ঘোষণা চাক্ষুষরূপে শক্তিশালী করা যে ধরনের এটা অংশ। একইভাবে ফাংশন পয়েন্টার ঘোষণার সাথে:(int* (*foo)(int))
  • int *identifierএবং class &identifierফাংশন পরামিতিগুলিতে দৃশ্যমানভাবে শক্তিশালী করতে যে প্যারামিটারটি সম্ভবত একটি তথাকথিত "আউট" পরামিতি।
  • const int * const * constযখনই আমি সিভি কোয়ালিফায়ার ব্যবহার করি ।
  • int * foo; স্থানীয় ঘোষণা।

আমি অনুমান করি আমি কিছুটা দৃষ্টি নিবদ্ধ।


1

সি তে কোন পয়েন্টার টাইপ নেই! সুতরাং, "ইনট *" এর অর্থ কিছুই নেই। তারকাচিহ্নটি সর্বদা এর ডানদিকে লিখিত উপাদানটির সাথে আবদ্ধ থাকে, এটি তার ডানদিকে থাকা উপাদানটির সাথে সম্পর্কিত। "* আমি" একটি অন্তর্নিহিত। এবং * আমি একটি অন্তর্নিহিত কারণ, এটি অনুসরণ করে যে আমি ইন্টি পয়েন্টার। এটি এর পেছনে যুক্তি যুক্ত এবং সে কারণেই "ইনট * আই" হ'ল একমাত্র সম্ভাব্য সমাধান। অন্য সব কিছুই একটি মায়া (যা বেশিরভাগ ক্ষেত্রেই সংকলক স্বয়ংক্রিয়ভাবে সংশোধন করে)। সি ++ এবং সি # তে এটি আলাদা কিছু। তবে সি এর জন্য কেবল একটি বাইবেল রয়েছে: "ডেনিস এম রিচি: দ্য সি প্রোগ্রামিং ল্যাঙ্গুয়েজ"। ডেনিস (আরআইপি!) এটি লিখেছেন: "ইনট * আই"। এটি নিয়ে প্রশ্ন করার দরকার নেই।


6
"সি তে কোনও পয়েন্টার টাইপ নেই" - আপনি এই ধারণাটি কোথায় পেলেন? int*একটি পয়েন্টার টাইপ।
কিথ থম্পসন

-2

আমি int *iএটি ব্যবহার করি কারণ এটি দেখতে পয়েন্টার এটি আরও সহজ, যদিও আমি মনে করি এটি আসলেই গুরুত্বপূর্ণ।

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