মানটি যখন আকারের অপারেটরে সরাসরি চলে যায় তখন কেন ডাটা টাইপের আকারের আকার আলাদা হয়?


15
#include <stdio.h>
int main() {
    char a = 'A';
    int b = 90000;
    float c = 6.5;
    printf("%d ",sizeof(6.5));
    printf("%d ",sizeof(90000));
    printf("%d ",sizeof('A'));
    printf("%d ",sizeof(c));
    printf("%d ",sizeof(b));
    printf("%d",sizeof(a));
    return 0;
}

আউটপুটটি হ'ল:

8 4 4 4 4 1

একই মানগুলির জন্য কেন আউটপুট আলাদা?


12
6.5ভাসা নয়, এটি একটিdouble
— নাথানঅলিভার

printf("%d",sizeof(6.5f));এটি করা একটি float।
— জনি এমপ্প

2
"আউটপুট এখানে আলাদা কেন?" কেন একই হতে হবে? আপনি একে অপরকে নির্ধারণ করতে পারবেন তার অর্থ এই নয় যে তাদের ঠিক একই ধরণের রয়েছে।
— স্লাভা

5
বিন্যাস নির্দিষ্টকরণকারক হওয়া উচিত, উদাহরণস্বরূপprintf("%zu", sizeof(6.5));
— ওয়েদার ভ্যান

উত্তর:


9

সি এর অক্ষর ধ্রুবকের (সি ++ এর বিপরীতে) টাইপ রয়েছে int। সুতরাং এই কল

printf("%d",sizeof('A'));

ফলাফল 4. sizeof( 'A' )এটি সমান sizeof( int )।

সি স্ট্যান্ডার্ড থেকে (6.4.4.4 অক্ষর ধ্রুবক)

10 একটি পূর্ণসংখ্যার চরিত্রের ধ্রুবকের টাইপ থাকে int ....

অন্যদিকে (6.5.3.4 আকার এবং alignof অপারেটর)

4 যখন আকার অপারেন্ডে প্রয়োগ করা হয় যেখানে টাইপ চর, স্বাক্ষরবিহীন চর, বা স্বাক্ষরিত চর, (বা এর কোয়ালিএড সংস্করণ) রয়েছে ফলাফল 1 হয়।

সুতরাং sizeofএই অভিব্যক্তিটির মধ্যে অপারেটরের অপারেন্ডের sizeof( 'A' )টাইপটি int থাকে যখন এই এক্সপ্রেশনটিতে sizeof( a )যেখানে একটির মতো ঘোষিত হয়

char a = 'A';

অপারেন্ড টাইপ আছে char।

এই মত কলগুলিতে মনোযোগ দিন

printf("%d",sizeof(6.5));

ভুল রূপান্তর বিন্যাস নির্দিষ্টকরণ ব্যবহার করুন। আপনাকে লিখতে হবে

printf("%zu",sizeof(6.5));

উপরের কলটিতে doubleএই কলটিতে থাকাকালীন ধরণের ধ্রুবক ব্যবহৃত হয়

printf("%zu",sizeof(c));

ভেরিয়েবলের cটাইপ রয়েছে float।

এই কলগুলির জন্য আপনি একই ফলাফলটি পেতে পারেন যদি প্রথম কলটি ধরণের ফ্লোটের মতো ধ্রুবক ব্যবহার করে

printf("%zu",sizeof(6.5f));

19

ভেরিয়েবলের মতো ধ্রুবকগুলির নিজস্ব ধরণের রয়েছে:

  • 6.5 : ধরণের ধরণের একটি ভাসমান বিন্দু double
  • 90000: ধরণের পূর্ণসংখ্যার ধরণ int(যদি int32 বিট হয়) বা long(যদি int16 বিট হয়)
  • 'A' : intসি এবং charসি ++ এ ধরণের একটি অক্ষর ধ্রুবক

যে আকারগুলি মুদ্রিত হয় তা হ'ল উপরের ধরণের আকার।

এছাড়াও, sizeofঅপারেটরের ফলাফলের ধরন রয়েছে size_t। সুতরাং প্রিন্ট করার সময় সঠিক বিন্যাস নির্দিষ্টকরণকারকটি ব্যবহার করার জন্য %zuনয় %d।


1

কারণ মানগুলি কোনও বিষয় নয় sizeof। এটি ধরণের আকার।

  • চরিত্রের ধ্রুবকগুলি intএস, নয় char।

  • ফ্লোটিং পয়েন্ট ধ্রুবক হয় ডিফল্টরূপে doubleগুলি যদি না আপনি তাদের সঙ্গে প্রত্যয় fবা l।

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