সি পয়েন্টারগুলির জন্য কেন নক্ষত্র ব্যবহার করে? [বন্ধ]


21

আমি এখন সি সম্পর্কে শিখছি।

আমার কাছে এটি বেআইনি মনে হয়েছে যে স্রষ্টাগুলি *প্রকৃতপক্ষে একটি পয়েন্টারের ( ) এর মতো দেখতে প্রতীকের চেয়ে পয়েন্টার হিসাবে প্রতীক হিসাবে বেছে নিয়েছিলেন ter->

ডেরেফারিং এবং ফাংশন পয়েন্টারগুলি কতটা বিভ্রান্তিকর হতে পারে তা বিবেচনা করে, নক্ষত্রটি ব্যবহার করার কোনও historicalতিহাসিক বা এমনকি ব্যবহারিক, কারণ আছে কি?


10
দ্রষ্টব্য যে ->সি ভাষায় একটি ডেরিফারেন্স অপারেটর হিসাবে ব্যবহৃত হচ্ছে - যখন কোনও কাঠামোর ক্ষেত্রে ক্ষেত্রগুলি অ্যাক্সেস করার সময়: struct_pointer->fieldএটি সংক্ষিপ্ত (*struct_pointer).field
আমন

@ এমন: এটি কেবলমাত্র অনুপ্রেরণার জন্যই প্রযোজ্য structs, যা আমার কাছে অদ্ভুত বলে মনে হয়েছিল। এটি একটি পয়েন্টার প্রতীক, তাই না? ( <-) অবজ্ঞার জন্য কেন নয় ? আমি কি সত্যিই এইভাবে চিন্তা করি?
নুব সাইবোট

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

আইএমএইচও পাসল শৈলী আরও ভাল। ^ব্যবহৃত হয় এবং একটি ঘোরানো তীর সম্পর্কে ভাবা যেতে পারে এবং "পয়েন্ট টু" হিসাবে পড়তে পারে, একই অর্থ তত ->সংক্ষিপ্ত। ^integerটাইপ ডিক্লেয়ারেশনের জন্য "পয়েন্টার টু ইন্টিজার" এবং এর var^অর্থ "মেমোরি varপয়েন্টস টু ডিফারেন্সিং"। বাম থেকে ডানে বামে পড়ার সময় প্রতীক অবস্থান সি-এর চেয়ে বেশি যৌক্তিক, যা সর্বদা টাইপের পরে এবং ভেরিয়েবল নামের আগে রাখা হয়। পাস্কেল @ঠিকানা গ্রহণের জন্যও ব্যবহার করে , যা এর চেয়ে ভাল &, কারণ @var"ঠিকানাটি যেখানে
বর্ণটি

উত্তর:


59

সি পয়েন্টারগুলির জন্য কেন নক্ষত্র ব্যবহার করে?

খালি - কারণ বি করেছে।

মেমরিটি একটি লিনিয়ার অ্যারে হওয়ায় এই অ্যারেতে সূচক হিসাবে কোনও কক্ষের মানটি ব্যাখ্যা করা সম্ভব হয় এবং বিসিপিএল এই উদ্দেশ্যে অপারেটর সরবরাহ করে। মূল ভাষায় এটি বানান করা হয়েছিল rv, এবং পরে !বি বি ইউনারি ব্যবহার করেছে *। সুতরাং, যদি pকোনও ঘর যদি অন্য কক্ষের সূচক (বা ঠিকানা), বা পয়েন্টার) *pসমন্বিত থাকে তবে পয়েন্ট-টু সেলটির বিষয়বস্তুগুলিকে রেফারেন্সের মান হিসাবে বা একটি অ্যাসাইনমেন্টের লক্ষ্য হিসাবে বোঝায়।

সি ভাষার উন্নতি থেকে of

এটাই. এই মুহুর্তে, প্রশ্নটি উদ্বেগহীন হিসাবে "পাইথন 3 .কোনও পদ্ধতি কল করতে কেন ব্যবহার করে? কেন নয় ->?" আচ্ছা ... কারণ পাইথন 2 .একটি পদ্ধতি কল করার জন্য ব্যবহার করে।

খুব কমই একটি ভাষার অস্তিত্ব নেই। এর প্রভাব রয়েছে এবং এটি আগে এসেছিল এমন কিছুর উপর ভিত্তি করে।


সুতরাং, কেন বি !পূর্বসূরি বিসিপিএলের মতো পয়েন্টারকে ডিফ্রান্সিংয়ের জন্য ব্যবহার করলেন না ?

ঠিক আছে, বিসিপিএল কিছুটা কথার ছিল। পরিবর্তে &&বা ||বিসিপিএল ব্যবহৃত হয়েছে logandএবং logor। এটি হ'ল বেশিরভাগ কীবোর্ডগুলিতে বা কী থাকে না এবং সমান নয় আসলে শব্দটি ছিল NEQV( বিসিপিএল রেফারেন্স ম্যানুয়াল দেখুন )।

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


ঠিক আছে, অন্যান্য বিকল্পগুলি সম্পর্কে কি ->?

->ক্ষেত্র derefrences প্রায় অন্বিত চিনি জন্য নিয়ে যাওয়া হয় struct_pointer->fieldযা(*struct_pointer).field

অন্যান্য বিকল্পের মতো <-অস্পষ্ট পার্সিং তৈরি করতে পারে। উদাহরণ স্বরূপ:

 foo <- bar

এটি কি পড়তে হবে:

(foo) <- (bar)

অথবা

(foo) < (-bar)

বাইনারি অপারেটর এবং অন্য একটি ইউনারি অপারেটরের সমন্বয়ে গঠিত অ্যানারি অপারেটর তৈরির ক্ষেত্রে সমস্যা হওয়ার সম্ভাবনা রয়েছে কারণ দ্বিতীয় ইউনিারি অপারেটর অন্য এক্সপ্রেশনটির উপসর্গ হতে পারে।

তদ্ব্যতীত, ঘন ঘন টাইপ করা জিনিসগুলি সর্বনিম্ন রাখার চেষ্টা করা আবার গুরুত্বপূর্ণ। আমি চাই ঘৃণা লেখার আছে:

int main(int argc, char->-> argv, char->-> envp)

এটি পড়াও কঠিন হয়ে পড়ে।

অন্যান্য চরিত্রগুলি সম্ভবত সম্ভব @ছিল ( অবজেক্টিভ সি এটি বরাদ্দ না করা পর্যন্ত এটি ব্যবহৃত হয়নি )। যদিও আবার, এটি 'সি ব্যবহারগুলি *কারণ বি করেছে' এর মূলটিতে যায়। কেন বি ব্যবহার করলো না @? ঠিক আছে, বি সমস্ত চরিত্র ব্যবহার করেনি। কোনও bppপ্রোগ্রাম ছিল না ( সিপিসি তুলনা করুন ) এবং অন্যান্য অক্ষরগুলি বিতে উপলব্ধ ছিল (যেমন #পরে সিপিপি ব্যবহার করেছিল)।

আমি যদি কোনও অনুমান করতে পারি তবে কেন কী - কীগুলি তা এটির কারণেই। বি এর একটি ম্যানুয়াল থেকে :

অ্যাড্রেসগুলিতে হেরফের করার পরামর্শ দেওয়া উচিত বলে মনে করা হয়, বি দুটি ইউনিারি অ্যাড্রেস অপারেটর সরবরাহ করে *এবং &&ঠিকানা অপারেটর তাই &xএর ঠিকানা হল x, অভিমানী এটা এক হয়েছে। *ইন্ডিয়ারেশন অপারেটর; *xমানে "ঠিকানা হিসাবে এক্স এর সামগ্রী ব্যবহার করুন।"

নোটটি &শিফট -7 এবং *শিফট -8 একে অপরের সাথে তাদের সান্নিধ্যতা প্রোগ্রামারের কাছে তারা কী করে সে সম্পর্কে একটি ইঙ্গিত হতে পারে ... তবে এটি কেবল অনুমান। কেন থম্পসনকে জিজ্ঞাসা করতে হবে যে এই পছন্দটি কেন করা হয়েছিল।


তাই সেখানে যদি আপনি এটি আছে. সি ছিল সেভাবে because বি সেভাবে হয় কারণ এটি বিসিপিএল কেমন ছিল তা থেকে পরিবর্তন করতে চেয়েছিল।


2
...অসাধারণ! এটি একটি দুর্দান্ত উত্তর, @ মিশেলটি! আপনি আমাকে historicalতিহাসিক এবং ব্যবহারিক উভয় কারণ দেখিয়েছিলেন এবং এমন জিনিস এমনকি আমি যথেষ্ট বুঝতে পারি নি তবে দেখতে পারি। ধন্যবাদ. +1
নুব সাইবোট

@ নূবসাইবট চরিত্রের পছন্দটি এতটা চুক্তি নয় যে অপারেটরটি পোস্টপেন্ড অপারেটরের চেয়ে প্রিপেন্ড হয়। এটি প্রচুর অতিরিক্ত প্যারেনের প্রয়োজন (যদিও -> সিনট্যাকটিক চিনি সাহায্য করে) যা অভিজ্ঞ সি ++ প্রোগ্রামারের জন্য এমনকি বোকা বাগগুলি বজায় রাখতে পারে।
ট্রিক্সি ওল্ফ

1
আপনি আরও উল্লেখ করতে পারেন যে সি প্রায় প্রতিটি আসকি বিরামচিহ্নের জন্য একটি ব্যবহার খুঁজে পেয়েছিল। অনেক অতিরিক্ত ছিল না। আমার ধারণা @অন্য সম্ভাবনা হত।
ডেভিড.পিএফএক্স

1
@ ডেভিড.পিএফএক্স আমি এটিকে প্রসারিত করেছি - যদিও সি এটি পছন্দ করে নি ... এটি বি ছিল। এবং, ভাল, আমি কেন (কীবোর্ডের সান্নিধ্য &এবং *) এটি সম্পর্কে একটি অনুমান করেছি । বি এছাড়াও ব্যবহার করেনি #তাই তখন আরও কয়েকটি স্পেয়ার ছিল ... এছাড়াও আছে $

1
@ ডেভিড.পিএফএক্স যে বি টিউটোরিয়ালটি পেয়েছি তা লিখেছিলেন বিডাব্লু কার্নিগান । দুর্ভাগ্যক্রমে, ডেনিস রিচি আর জিজ্ঞাসা করতে পারবেন না ('11 এর অক্টোবরে তিনি মারা গেলেন) যখন কার্নিঘান সম্ভবত প্রিন্সটনের সিএস বিভাগে অধ্যাপক ছিলেন। কেন থম্পসন (বি এর অন্যান্য স্রষ্টা) গুগলে কাজ করেন ... কিছু কীবোর্ডের সাথেও সমস্যা থাকতে পারে (আমরা সাধারণ কী হিসাবে কী বিবেচনা করব সেটির জন্য সি ট্রিগ্রাফ দ্বারা ইঙ্গিত করা হয়েছে) প্রস্তাবিত যে এগুলি সমস্ত উপলব্ধ ছিল না ( আমি নিশ্চিত না যে '@' ছিল কিনা)।

55

আমি একজন ছাত্র দ্বারা জিজ্ঞাসা করা হল যদি &এবং *চয়ন করা হয়েছে কারণ তারা কীবোর্ডে পরবর্তী প্রতিটি অন্যান্য ছিলেন (যেটা আমি কখনো লক্ষ্য করেছেন)। অনেকটা গুগলিং আমাকে বি এবং বিসিপিএল ডকুমেন্টেশন এবং এই থ্রেডে নিয়ে গেছে। তবে আমি কিছুতেই খুঁজে পাইনি। দেখে মনে হয়েছিল *বি তে অনেক কারণ রয়েছে , তবে এর জন্য আমি কিছুই খুঁজে পেলাম না &

সুতরাং @ মাইকেল্টের পরামর্শ অনুসরণ করে আমি কেন থম্পসনকে জিজ্ঞাসা করেছি:

থেকে: কেন থম্পসন <ken@google.com>

কীবোর্ড কাছাকাছি: না।
সি থেকে বি থেকে অনুলিপি করা হয়েছে & এবং * একই।
বি পূর্ববর্তী ভাষাগুলি থেকে * পেয়েছিল - কিছু সমাবেশ,
বিসিপিএল এবং আমি মনে করি pl / 1।
আমি মনে করি যে আমি ব্যবহার করেছি এবং কারণ (অ্যাম্পারস্যান্ড) নামটি
"ঠিকানা" বলে মনে হচ্ছে। বি
একটি টেলি টাইপ মডেল 33 টেলি টাইপ দিয়ে চালানোর জন্য ডিজাইন করা হয়েছিল । (5 বিট বাড-ও কোড)
সুতরাং প্রতীকগুলির ব্যবহার সীমাবদ্ধ ছিল।


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