সি / সি ++ তে অক্ষরের আকার ('a')


298

সি এবং সি ++ তে চরিত্রের আকার কত? আমি যতদূর জানি সি এবং সি ++ উভয় ক্ষেত্রে চরের আকার 1 বাইট।

সি তে:

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}

সি ++ এ:

#include <iostream>
int main()
{
    std::cout << "Size of char : " << sizeof(char) << "\n";
    return 0;
}

এতে অবাক হওয়ার কিছু নেই, উভয়ই আউটপুট দেয়: Size of char : 1

এখন আমরা জানি যে অক্ষর প্রতিনিধিত্ব করা হয় যেমন 'a', 'b', 'c', '|', ... তাই আমি শুধুমাত্র এই উপরের কোড সংশোধিত:

সি তে:

#include <stdio.h>
int main()
{
    char a = 'a';
    printf("Size of char : %d\n", sizeof(a));
    printf("Size of char : %d\n", sizeof('a'));
    return 0;
}

আউটপুট:

Size of char : 1
Size of char : 4

সি ++ এ:

#include <iostream>
int main()
{
    char a = 'a';
    std::cout << "Size of char : " << sizeof(a) << "\n";
    std::cout << "Size of char : " << sizeof('a') << "\n";
    return 0;
}

আউটপুট:

Size of char : 1
Size of char : 1

sizeof('a')সি এবং সি ++ এ কেন বিভিন্ন মান ফেরত দেয়?


8
"%|"বিন্যাস একটি প্রয়োজন intযুক্তি (অথবা কিছু যে করতে প্রচার করে int)। sizeofধরণের ফলাফল দেয় size_t। হয় কোনও intকাস্ট ব্যবহার করে রূপান্তর করুন বা, যদি আপনার প্রয়োগটি এটি সমর্থন করে তবে ব্যবহার করুন "%zu"
কিথ থম্পসন

উত্তর:


348

সি, একটি অক্ষর টাইপ ধ্রুবক মত 'a'আসলে একটি হয় int, (অথবা অন্য কোনো বাস্তবায়ন নির্ভর মান) 4 আকার সঙ্গে। সি ++ তে, টাইপটি হয় char, এর আকার 1। এটি দুটি ভাষার মধ্যে অনেক ছোট পার্থক্যের একটি।


12
সি ++ স্ট্যান্ডার্ডে এটি বিভাগ 2.13.2 / 1, সি 6.4.4.4 এ, অন্তত আমি যে দস্তাবেজ পেয়েছি সেটিতে।

14
+1 (যদিও "4 এর আকার" স্পষ্টতই nthrgeek এর প্ল্যাটফর্মের জন্য প্রযোজ্য, অগত্যা এটি সমস্ত প্ল্যাটফর্মের ক্ষেত্রে প্রযোজ্য নয়))
এসবিআই

28
@nthrgeek: আমি খুব উভয় মান উদ্ধৃত করা অলস, কিন্তু C ++ স্ট্যান্ডার্ডের একটি পরিশিষ্ট সি অধীনে পরিশিষ্ট C.1.1 সঙ্গে অসামঞ্জস্যপূর্ণ নিবেদিত আছে, এটা উল্লেখ করেছেন যে "চরিত্র আক্ষরিক প্রকার থেকে পরিবর্তিত হয় intথেকে char, যা আচরণ ব্যাখ্যা করে। :)
জাল্ফ

3
@ অ্যান্ট্রজেক: .4§.৪.৪.৪, অনুচ্ছেদ ১০: "একটি পূর্ণসংখ্যার চরিত্রের ধ্রুবকটি টাইপ ইন্ট থাকে a একক অক্ষরের সমন্বিত একটি পূর্ণসংখ্যার অক্ষরের মান যে একক বাইট প্রয়োগের অক্ষরকে মানচিত্র করে তা ম্যাপযুক্ত প্রতিনিধির সংখ্যাসূচক মান হয় চরিত্রটিকে পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করা হয়।
স্টিফেন ক্যানন

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

26

হিসাবে পৌল বলেছিলেন, এটা কারণ 'a'একজন intসি কিন্তু একটি charC ++।

আমি কয়েক বছর আগে লিখেছি এমন কিছুতে সি এবং সি ++ এর মধ্যে সেই নির্দিষ্ট পার্থক্যটি কভার করেছি: http://david.tribble.com/text/cdiffs.htm


4
কেবল কৌতূহলী, তবে আপনি কি সি ++ 11 এবং সি 11-তে নতুন পরিবর্তনগুলি অন্তর্ভুক্ত করতে (খুব বিস্তারিত) ডকটি আপডেট করার বিষয়ে কাজ করছেন?
অ্যাডাম রোজেনফিল্ড

মুহূর্তে না. সি এবং সি ++ এর প্রতি আমার আগ্রহ গত পাঁচ বছর বা তার পরে অনেকটা হ্রাস পেয়েছে।
ডেভিড আর ট্রিবিলে

3
ওহো, আমি আপনার কাজ ব্যবহৃত লিখতে এই এবং এখানে আপনি এখন আছেন। এত ছোট একটা পৃথিবী!

17

সি ইন চরিত্র লিটারেল ধরণ হয় int- এ এবং গৃহস্থালির কাজ সি ++ হবে। এটি সি ++ এ ফাংশন ওভারলোডিং সমর্থন করার জন্য প্রয়োজনীয় । এই উদাহরণটি দেখুন:

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

আউটপুট:

char

5

সি ভাষায় , অক্ষর আক্ষরিক একটি charপ্রকার নয়। সি চরিত্রকে আক্ষরিক হিসাবে বিবেচনা করে। সুতরাং, sizeof('a')এবং এর মধ্যে কোনও পার্থক্য নেই sizeof(1)

সুতরাং, আকারের আকারের অক্ষর সি এর আকারের পূর্ণসংখ্যার সমান is

সি ++ ভাষায় , অক্ষর আক্ষরিক ধরণের charCppreference সে-র:

1) সংকীর্ণ অক্ষর আক্ষরিক বা সাধারণ চরিত্র আক্ষরিক, যেমন 'a'বা '\n'বা '\13'। এই ধরনের আক্ষরিকের টাইপ থাকেchar এবং এক্সিকিউশন চরিত্রের সেটটিতে সি-চরের প্রতিনিধির সমান মান থাকে। এক্স-এক্সিকিউশন ক্যারেক্টার সেটে সি-চরটি যদি একক বাইট হিসাবে উপস্থাপনযোগ্য না হয় তবে আক্ষরিকের টাইপ ইন্ট এবং বাস্তবায়ন-সংজ্ঞায়িত মান থাকে।

সুতরাং, সি ++ অক্ষরে আক্ষরিক এক প্রকার char। সুতরাং, সি ++ তে অক্ষরের অক্ষরের আকারটি একটি বাইট।

অ্যালোস, আপনার প্রোগ্রামগুলিতে, আপনি sizeofঅপারেটরের জন্য ভুল ফর্ম্যাট স্পেসিফায়ার ব্যবহার করেছেন ।

সি 11 §7.21.6.1 (পি 9):

যদি কোনও রূপান্তর স্পেসিফিকেশন অবৈধ হয়, তবে আচরণটি সংজ্ঞায়িত হয় 75) any) কোনও যুক্তি যদি সম্পর্কিত রূপান্তর নির্দিষ্টকরণের জন্য সঠিক ধরণের না হয় তবে আচরণটি অপরিজ্ঞাত।

সুতরাং, আপনার %zuপরিবর্তে ফর্ম্যাট স্পেসিফায়ার ব্যবহার করা উচিত %d, অন্যথায় এটি সি তে অপরিজ্ঞাত আচরণ is


%zuঅনেক প্ল্যাটফর্মে সমর্থিত নয়, তবে আরও ভাল বহনযোগ্যতা, ব্যবহার (int)sizeof(char)এবং ফর্ম্যাট%d
chqrlie

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