আকারকে অপারেটর হিসাবে বিবেচনা করা হয় কেন?


95

কেন sizeofএকটি অপারেটর হিসাবে বিবেচিত হয় এবং একটি ফাংশন নয়?

অপারেটর হিসাবে যোগ্যতার জন্য কোন সম্পত্তিটি প্রয়োজনীয়?

উত্তর:


183

কারণ সি স্ট্যান্ডার্ড তাই বলে, এবং এটি একমাত্র ভোট পায়।

ফলাফল হিসাবে:

  • আকারের অপারেন্ডটি প্রথম বন্ধনীযুক্ত ধরণের হতে পারে, sizeof (int) কোনও অবজেক্ট এক্সপ্রেশনের পরিবর্তে ।
  • প্রথম বন্ধনী অপ্রয়োজনীয়: int a; printf("%d\n", sizeof a);পুরোপুরি ঠিক আছে। এগুলি প্রায়শই দেখা যায়, প্রথমত কারণ এগুলি একটি প্রকারের কাস্ট এক্সপ্রেশনের অংশ হিসাবে প্রয়োজন হয় এবং দ্বিতীয়ত যে আকারের খুব উচ্চতর প্রাধান্য রয়েছে, তাই sizeof a + bএকই রকম নয়sizeof (a+b) । তবে তারা আকারের অনুরোধের অংশ নয়, তারা অপারেন্ডের অংশ।
  • আপনি আকারের ঠিকানা নিতে পারবেন না।
  • এক্সপ্রেশন যা আকারের অপারেন্ড হয় রানটাইমের সময় মূল্যায়ন হয় না (sizeof a++ সংশোধন করে না)।
  • মাপের অপারেন্ডারটি হ'ল এক্সপ্রেশনটি শূন্য বা ফাংশনের ধরণের ব্যতীত অন্য কোনও ধরণের থাকতে পারে। প্রকৃতপক্ষে, এটি আকারের পয়েন্ট এক ধরণের।

একটি ফাংশন all সমস্ত পয়েন্ট পৃথক হবে। একটি ফাংশন এবং অযৌক্তিক অপারেটরের মধ্যে সম্ভবত অন্যান্য পার্থক্য রয়েছে, তবে আমি মনে করি যে এটি আকারে এটি হতে চায় এমন কোনও কারণ থাকলেও আকার কেন একটি ফাংশন হতে পারে না তা দেখাতে যথেষ্ট।


4
বাহ, আমি কী ভাবছিলাম!
ক্র্যাশমস্ট্র্ট

7
এর চেয়ে ভাল বলতে পারছি না।
ক্লিমেন্ট হেরেম্যান

আমি বিশ্বাস করি পরিবর্তনশীল দৈর্ঘ্যের অ্যারেগুলির (ভিএলএ) কারণে আজকাল জিনিসগুলি আরও জটিল। আইআইআরসি, মানটি এমনকি sizeofঅভিব্যক্তিতে কোনও ভিএলএ থাকলে পার্শ্ব প্রতিক্রিয়া হতে দেয় ।
অ্যারন ম্যাকডেইড

@glglgl না, এটি কোনও মানে করে না। এই প্রসঙ্গে, (int)অভিনব কিছু নয় - প্রথম বন্ধনীগুলির মধ্যে কেবলমাত্র একটি নাম। এখানকার প্যারেন্থিসগুলি সিনট্যাক্সের একটি অংশ sizeof- কোনও প্রকারের আকার নেওয়ার সময় এগুলি প্রয়োজন হয় তবে কোনও অভিব্যক্তির আকার নেওয়ার সময় প্রয়োজন হয় না। উদাহরণস্বরূপ এখানে
anatolyg

4
স্ট্যান্ডার্ডটি এর জন্য দুটি স্বরলিপি ব্যবহার করে sizeof: sizeof unary-expressionএবং sizeof ( type-name )- সুতরাং সি 11 মানকটিকে এটি 'কাস্ট' নয় তবে একটি প্রথম বন্ধনযুক্ত টাইপের নাম বলে মনে করা হয়। নেট ফলাফল অনেক একই। (তুলনা করার জন্য, একটি কাস্ট এক্সপ্রেশন ( type-name ) cast-expression)) এবং আমি মার্কডাউন প্রশ্নোত্তর থেকে আলাদা আলাদাভাবে কাজ করে এমন মন্তব্যকে ঘৃণা করি এবং মার্কডাউন!
জোনাথন লেফলার

24

এটি একটি সংকলন-সময় ধ্রুবক হিসাবে ব্যবহার করা যেতে পারে, এটি কেবল তখনই সম্ভব যদি এটি কোনও ফাংশনের পরিবর্তে অপারেটর হয়। এই ক্ষেত্রে:

union foo {
    int i;
    char c[sizeof(int)];
};

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


4
+1 তবে নোট করুন যে এটি একটি সংকলন-সময় ধ্রুবক নয় যখন আর্গুমেন্টটি VLA হয় - পরিবর্তনশীল দৈর্ঘ্যের অ্যারে ar
জোনাথন লেফলার

6

কারণ সি স্ট্যান্ডার্ড তাই বলে, এবং এটি একমাত্র ভোট পায়।

এবং স্ট্যান্ডার্ডটি সম্ভবত সঠিক কারণ sizeofএকটি টাইপ নেয় এবং

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

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

(উইকিপিডিয়া)


এটি সম্ভবত "অপারেটর" এবং "ফাংশন" পদটি তাদের মতো ব্যবহার করার ক্ষেত্রে সি স্ট্যান্ডার্ড (এবং অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজ) এর অনুপ্রেরণাকে ব্যাখ্যা করে।
স্টিভ জেসোপ

5

কারণ এটি কোনও ফাংশন নয়। আপনি এটির মতো ব্যবহার করতে পারেন:

int a;
printf("%d\n", sizeof a);

ফাংশনটিতে এন্ট্রি পয়েন্ট, কোড ইত্যাদি থাকে ফাংশনটি রানটাইম (বা ইনলাইনড) এ চালানো হয়, আকারটি সংকলন-সময়ে নির্ধারণ করতে হয়।


2

আকারের অপারেটরটি টাইম সত্তাকে সংকলন করে যা রানটাইম নয় এবং কোনও ফাংশনের মতো প্রথম বন্ধনী প্রয়োজন হয় না। কোডটি যখন সংকলিত হয় তখন এটি সংকলনের সময় সেই ভেরিয়েবলের আকারের সাথে মানটি প্রতিস্থাপন করে তবে ফাংশন কার্য সম্পাদনের পরে কার্য সম্পাদন হয় তার পরে আমরা ফিরে আসার মানটি জানব।


1

কারণ:

  • যখন আপনি কোনও ফাংশনে কোনও মান পাস করেন, তখন বস্তুর আকার ফাংশনে প্রেরণ করা হয় না, তাই ক sizeof "ফাংশন" এর আকার নির্ধারণের উপায় নেই
  • সি তে, ফাংশনগুলি কেবল এক ধরণের যুক্তি গ্রহণ করতে পারে; মাপের () সমস্ত ধরণের ডিফারনেট জিনিস গ্রহণ করতে হবে (ভেরিয়েবল পাশাপাশি প্রকারের! আপনি সি তে কোনও ফাংশনে কোনও প্রকার পাস করতে পারবেন না)
  • একটি ফাংশন কল করার মধ্যে যুক্তিগুলির অনুলিপি এবং অন্যান্য অপ্রয়োজনীয় ওভারহেড জড়িত

1

ফাংশন থেকে ছোট দ্বিধা আছে - আকারের মান সংকলন সময়ে সমাধান করা হয়, তবে রানটাইম এ নয়!


7
ভিএলএ বাদে - পরিবর্তনশীল দৈর্ঘ্যের অ্যারে - আর্গুমেন্ট।
জোনাথন লেফলার

1

কারণ এটি একটি সংকলন-সময় অপারেটর যা কোনও সামগ্রীর আকার গণনা করার জন্য টাইপ তথ্য প্রয়োজন যা কেবল সংকলন-সময়ে পাওয়া যায়। এটি সি ++ এর জন্য ধারণ করে না।


0

sizeof()অপারেটর একটি সংকলন সময় ঘটনা হবে। এটি পরামিতি বা তর্কগুলি নির্ধারণ করতে ব্যবহার করা যেতে পারে।


-1

আকারের (), আমি স্পষ্টত মনে করি এটি একটি ফাংশন এবং অপারেটর উভয়ই। কেন? কারণ একটি ফাংশন প্রবেশের পর্যায়ে প্রবেশের জন্য বন্ধনী ধারণ করে। তবে প্রধানত অপারেটর কারণগুলির জন্য অপারেটরগুলিও অ্যাকশন চরিত্র, সুতরাং আকারটি একটি ক্রিয়া বিবৃতি যা বন্ধনীগুলির মধ্যে অপারেন্ডে কাজ করে।

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