কেন sizeof
একটি অপারেটর হিসাবে বিবেচিত হয় এবং একটি ফাংশন নয়?
অপারেটর হিসাবে যোগ্যতার জন্য কোন সম্পত্তিটি প্রয়োজনীয়?
উত্তর:
কারণ সি স্ট্যান্ডার্ড তাই বলে, এবং এটি একমাত্র ভোট পায়।
ফলাফল হিসাবে:
sizeof (int)
কোনও অবজেক্ট এক্সপ্রেশনের পরিবর্তে ।int a; printf("%d\n", sizeof a);
পুরোপুরি ঠিক আছে। এগুলি প্রায়শই দেখা যায়, প্রথমত কারণ এগুলি একটি প্রকারের কাস্ট এক্সপ্রেশনের অংশ হিসাবে প্রয়োজন হয় এবং দ্বিতীয়ত যে আকারের খুব উচ্চতর প্রাধান্য রয়েছে, তাই sizeof a + b
একই রকম নয়sizeof (a+b)
। তবে তারা আকারের অনুরোধের অংশ নয়, তারা অপারেন্ডের অংশ।sizeof a++
সংশোধন করে না)।একটি ফাংশন all সমস্ত পয়েন্ট পৃথক হবে। একটি ফাংশন এবং অযৌক্তিক অপারেটরের মধ্যে সম্ভবত অন্যান্য পার্থক্য রয়েছে, তবে আমি মনে করি যে এটি আকারে এটি হতে চায় এমন কোনও কারণ থাকলেও আকার কেন একটি ফাংশন হতে পারে না তা দেখাতে যথেষ্ট।
sizeof
অভিব্যক্তিতে কোনও ভিএলএ থাকলে পার্শ্ব প্রতিক্রিয়া হতে দেয় ।
(int)
অভিনব কিছু নয় - প্রথম বন্ধনীগুলির মধ্যে কেবলমাত্র একটি নাম। এখানকার প্যারেন্থিসগুলি সিনট্যাক্সের একটি অংশ sizeof
- কোনও প্রকারের আকার নেওয়ার সময় এগুলি প্রয়োজন হয় তবে কোনও অভিব্যক্তির আকার নেওয়ার সময় প্রয়োজন হয় না। উদাহরণস্বরূপ এখানে
sizeof
: sizeof unary-expression
এবং sizeof ( type-name )
- সুতরাং সি 11 মানকটিকে এটি 'কাস্ট' নয় তবে একটি প্রথম বন্ধনযুক্ত টাইপের নাম বলে মনে করা হয়। নেট ফলাফল অনেক একই। (তুলনা করার জন্য, একটি কাস্ট এক্সপ্রেশন ( type-name ) cast-expression
)) এবং আমি মার্কডাউন প্রশ্নোত্তর থেকে আলাদা আলাদাভাবে কাজ করে এমন মন্তব্যকে ঘৃণা করি এবং মার্কডাউন!
এটি একটি সংকলন-সময় ধ্রুবক হিসাবে ব্যবহার করা যেতে পারে, এটি কেবল তখনই সম্ভব যদি এটি কোনও ফাংশনের পরিবর্তে অপারেটর হয়। এই ক্ষেত্রে:
union foo {
int i;
char c[sizeof(int)];
};
সিনট্যাক্টিক্যালি যদি এটি অপারেটর না হয়ে থাকে তবে এটি প্রিপ্রোসেসর ম্যাক্রো হতে হবে যেহেতু ফাংশনগুলি আর্গুমেন্ট হিসাবে ধরণ নিতে পারে না। এটি কার্যকর করা কঠিন ম্যাক্রো হবে যেহেতু sizeof
যুক্তি হিসাবে উভয় প্রকার এবং ভেরিয়েবল গ্রহণ করতে পারে।
কারণ সি স্ট্যান্ডার্ড তাই বলে, এবং এটি একমাত্র ভোট পায়।
এবং স্ট্যান্ডার্ডটি সম্ভবত সঠিক কারণ sizeof
একটি টাইপ নেয় এবং
সাধারণভাবে, যদি কোনও ফাংশনের ডোমেন বা কোডোমাইন (বা উভয়) এর মধ্যে প্রকৃত সংখ্যাগুলির তুলনায় উল্লেখযোগ্য পরিমাণে জটিল উপাদান থাকে তবে সেই ফাংশনটিকে অপারেটর হিসাবে উল্লেখ করা হয়। বিপরীতভাবে, যদি কোনও ফাংশনের ডোমেন বা কোডোমাইন দুটিতে আসল সংখ্যার চেয়ে জটিল উপাদান থাকে তবে সেই ফাংশনটি কেবল একটি ফাংশন হিসাবে উল্লেখ করা যেতে পারে। ট্রাইগনোমেট্রিক ফাংশন যেমন কোসাইন পরের ক্ষেত্রে উদাহরণ।
অতিরিক্তভাবে, যখন ফাংশনগুলি প্রায়শই ব্যবহার করা হয় যে তারা জেনেরিক এফ (এক্স, ওয়াই, জেড, ...) ফর্মের চেয়ে দ্রুত বা সহজ স্বীকৃতিগুলি বিকশিত করেছে, ফলস্বরূপ বিশেষ ফর্মগুলি অপারেটরও বলা হয়। উদাহরণগুলির মধ্যে ইনফিক্স অপারেটর যেমন সংযোজন "+" এবং বিভাগ "/" এবং পোস্টফিক্স অপারেটর যেমন ফ্যাক্টরিয়াল "!" অন্তর্ভুক্ত রয়েছে। এই ব্যবহার জড়িত সত্তাগুলির জটিলতার সাথে সম্পর্কিত নয়।
কারণ এটি কোনও ফাংশন নয়। আপনি এটির মতো ব্যবহার করতে পারেন:
int a;
printf("%d\n", sizeof a);
ফাংশনটিতে এন্ট্রি পয়েন্ট, কোড ইত্যাদি থাকে ফাংশনটি রানটাইম (বা ইনলাইনড) এ চালানো হয়, আকারটি সংকলন-সময়ে নির্ধারণ করতে হয়।
আকারের অপারেটরটি টাইম সত্তাকে সংকলন করে যা রানটাইম নয় এবং কোনও ফাংশনের মতো প্রথম বন্ধনী প্রয়োজন হয় না। কোডটি যখন সংকলিত হয় তখন এটি সংকলনের সময় সেই ভেরিয়েবলের আকারের সাথে মানটি প্রতিস্থাপন করে তবে ফাংশন কার্য সম্পাদনের পরে কার্য সম্পাদন হয় তার পরে আমরা ফিরে আসার মানটি জানব।
কারণ:
sizeof
"ফাংশন" এর আকার নির্ধারণের উপায় নেইফাংশন থেকে ছোট দ্বিধা আছে - আকারের মান সংকলন সময়ে সমাধান করা হয়, তবে রানটাইম এ নয়!
আকারের (), আমি স্পষ্টত মনে করি এটি একটি ফাংশন এবং অপারেটর উভয়ই। কেন? কারণ একটি ফাংশন প্রবেশের পর্যায়ে প্রবেশের জন্য বন্ধনী ধারণ করে। তবে প্রধানত অপারেটর কারণগুলির জন্য অপারেটরগুলিও অ্যাকশন চরিত্র, সুতরাং আকারটি একটি ক্রিয়া বিবৃতি যা বন্ধনীগুলির মধ্যে অপারেন্ডে কাজ করে।