অক্ষরের পরিবর্তে সি বর্ণের আক্ষরিক অন্তর্নিহিত কেন?


103

সি ++ এ sizeof('a') == sizeof(char) == 1,। এটি স্বজ্ঞাত অর্থে তোলে, যেহেতু 'a'একটি চরিত্র আক্ষরিক, এবং sizeof(char) == 1মান দ্বারা সংজ্ঞায়িত।

সি তবে sizeof('a') == sizeof(int),। এটি হ'ল এটি প্রদর্শিত হয় যে সি অক্ষরের অক্ষরগুলি আসলে পূর্ণসংখ্যা হয়। কোন এক কেন জানেন না? আমি এই সি quirk এর প্রচুর উল্লেখ খুঁজে পেতে পারি তবে এটি কেন বিদ্যমান তার কোনও ব্যাখ্যা নেই।


সাইজের মাত্র একটি বাইটের আকারটি ফিরে আসবে না? আকার এবং চার্জ একটি সমান হয় না?
জোশ স্মিটন

1
এটি সম্ভবত সংকলক (এবং আর্কিটেকচার) নির্ভর। আপনি কি ব্যবহার করছেন তা বলতে যত্নবান? মান (কমপক্ষে '89 অবধি) খুব আলগা ছিল।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

2
কোন। একটি চরটি সর্বদা 1 বাইট বড়, তাই আকারের ('a') == 1 সর্বদা (সি ++ তে) থাকে, যখন কোনও আন্তঃনীতি তাত্ত্বিকভাবে 1 এর আকার হতে পারে তবে এর জন্য কমপক্ষে 16 বাইটের বাইট লাগবে, যা খুব সম্ভবত: ) তাই আকার ('এ')! = আকারে (ইনট) বেশিরভাগ বাস্তবায়নে সি ++ তে খুব সম্ভবত
জোহানেস স্কাউব - লিটব

2
... এটা সি সবসময় ভুল যখন
litb - জোহানেস Schaub

22
'এ' সি - পিরিয়ডের অন্তর্নির্মিত। সি সেখানে প্রথম পেয়েছিল - সি নিয়ম তৈরি করেছিল। সি ++ নিয়ম পরিবর্তন করেছে। আপনি যুক্তি দিতে পারেন যে সি ++ বিধি আরও বোধগম্য হয় তবে সি নিয়মগুলি পরিবর্তন করা ভালের চেয়ে আরও বেশি ক্ষতি করতে পারে তাই সি স্ট্যান্ডার্ড কমিটি বুদ্ধিমানের সাথে এটি স্পর্শ করতে পারেনি।
জোনাথন লেফলার

উত্তর:


36

একই বিষয়ে আলোচনা

"আরও সুনির্দিষ্টভাবে অবিচ্ছেদ্য প্রচারসমূহ & কেএন্ডআর সিতে অক্ষরের মানটিকে প্রথমে উন্নীত না করে ব্যবহার করা কার্যত (?) অসম্ভব, সুতরাং প্রথম স্থানে অক্ষরকে ধ্রুবক হিসাবে তৈরি করা সেই পদক্ষেপটি মুছে ফেলেছিল multi বহু অক্ষর ছিল এবং এখনও রয়েছে 'এবিসিডি' বা "তবে অনেকগুলি ইনট্রিতে ফিট করে।"


মাল্টি-ক্যারেক্টার ধ্রুবকগুলি পোর্টেবল নয়, এমনকি একটি একক মেশিনে সংকলকগুলির মধ্যেও (যদিও জিসিসি প্ল্যাটফর্মগুলি জুড়ে স্ব-সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে)। দেখুন: স্ট্যাকওভারফ্লো.com
জোনাথন লেফলার

8
আমি লক্ষ করব যে ক) এই উদ্ধৃতিটি অবৈধ; উদ্ধৃতিটি কেবল বলেছেন "আপনি কি এই মতামতটির সাথে একমত নন, যে বিষয়টি নিয়ে প্রশ্নে আলোচনার জন্য অতীত থ্রেডে পোস্ট করা হয়েছিল?" ... এবং খ) এটি হাস্যকর , কারণ একটি charপরিবর্তনশীল কোনও ইনট নয়, সুতরাং একটি চরিত্রকে ধ্রুবক হিসাবে তৈরি করা একটি বিশেষ ক্ষেত্রে। এবং এটা প্রচার ছাড়া একটি অক্ষর মান ব্যবহার করা খুবই সহজ: c1 = c2;। ওটিওএইচ c1 = 'x'একটি নিম্নমুখী রূপান্তর। সর্বাধিক গুরুত্বপূর্ণ, sizeof(char) != sizeof('x')যা গুরুতর ভাষা বটচ। মাল্টিবাইট চরিত্রের ধ্রুবক হিসাবে: তারা কারণ, কিন্তু তারা অপ্রচলিত।
জিম বাল্টার

27

মূল প্রশ্নটি "কেন?"

কারণটি হ'ল আক্ষরিক চরিত্রের সংজ্ঞাটি বিবর্তিত হয়েছে এবং পরিবর্তিত হয়েছে, যখন বিদ্যমান কোডের সাথে পিছনে সামঞ্জস্য থাকার চেষ্টা করছেন।

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

এর অর্থ হ'ল আপনি যখন ফাংশনটি লিখছেন তখন সমস্ত প্যারামিটারগুলি যা দ্বিগুণ ছিল না তা স্ট্যাকের হিসাবে ইনট হিসাবে সঞ্চিত ছিল, আপনি তাদের কীভাবে ঘোষণা করলেন না কেন, এবং কম্পাইলারটি আপনার জন্য এটি পরিচালনা করার জন্য ফাংশনে কোড রেখেছিল।

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

যখন এএনএসআই কমিটি প্রথম সিটিকে মানদণ্ডিত করেছিল, তখন তারা এই নিয়মটি পরিবর্তন করেছিল যাতে একটি চরিত্রের আক্ষরিক কেবল অন্তর্নিহিত হতে পারে, যেহেতু এটি একই জিনিস অর্জনের সহজ উপায় বলে মনে হয়েছিল।

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

এ কারণেই তারা আলাদা। বিবর্তন ...


2
আসলে 'কেন?' উত্তর দেওয়ার জন্য আমার কাছ থেকে +1। তবে আমি সর্বশেষ বিবৃতিটির সাথে একমত নই - "সি ++ এর মধ্যে এটির সুবিধাটি হ'ল চার প্যারামিটার সহ একটি ফাংশনের এবং কোনও ইনট প্যারামিটার সহ একটি ফাংশনের বিভিন্ন স্বাক্ষর রয়েছে" - সি ++ এ এখনও 2 ফাংশনের পরামিতি থাকা সম্ভব একই আকার এবং বিভিন্ন স্বাক্ষর, যেমন void f(unsigned char)বনাম void f(signed char)
পিটার কে

3
@ পিটারক জন এটিকে আরও ভাল করে রাখতে পারতেন তবে তিনি যা বলেন তা মূলত নির্ভুল। সি ++ এর পরিবর্তনের প্রেরণাটি ছিল, আপনি যদি লিখেন তবে f('a')আপনি সম্ভবত f(char)এই কলটির চেয়ে ওভারলোড রেজোলিউশনটি বেছে নিতে চান f(int)। আপনি যেমনটি বলে থাকেন তেমন আপেক্ষিক আকার intএবং charপ্রাসঙ্গিক নয়।
zwol

21

সিতে একটি অক্ষর আক্ষরিক টাইপ ইন্টের নির্দিষ্ট কারণগুলি আমি জানি না। তবে সি ++ এ সেভাবে না যাওয়ার জন্য ভাল কারণ রয়েছে। এই বিবেচনা:

void print(int);
void print(char);

print('a');

আপনি আশা করতে পারেন যে মুদ্রণ করার জন্য কলটি গৃহীত হয়ে দ্বিতীয় সংস্করণ নির্বাচন করবে। একটি চরিত্রের আক্ষরিক অন্তর্ভুক্ত হওয়া অসম্ভব হয়ে উঠবে। মনে রাখবেন যে সি ++ আক্ষরিক ক্ষেত্রে একাধিক অক্ষর রয়েছে তার টাইপ ইন্ট রয়েছে, যদিও তাদের মান বাস্তবায়ন সংজ্ঞায়িত হয়। সুতরাং, 'ab'টাইপ আছে int, যখন 'a'টাইপ আছে char


হ্যাঁ, "সি ++ এর ডিজাইন এবং বিবর্তন" বলছেন যে ওভারলোডেড ইনপুট / আউটপুট রুটিনগুলি সি ++ নিয়ম পরিবর্তন করার মূল কারণ ছিল।
ম্যাক্স ল্যাববার্ট

5
সর্বোচ্চ, হ্যাঁ আমি প্রতারণা করেছি। আমি সামঞ্জস্যতা বিভাগে স্ট্যান্ডার্ডটি দেখেছি :)
জোহানেস স্কাউব - লিটব

18

আমার ম্যাকবুকটিতে জিসিসি ব্যবহার করে, আমি চেষ্টা করে দেখি:

#include <stdio.h>
#define test(A) do{printf(#A":\t%i\n",sizeof(A));}while(0)
int main(void){
  test('a');
  test("a");
  test("");
  test(char);
  test(short);
  test(int);
  test(long);
  test((char)0x0);
  test((short)0x0);
  test((int)0x0);
  test((long)0x0);
  return 0;
};

রান যখন দেয়:

'a':    4
"a":    2
"":     1
char:   1
short:  2
int:    4
long:   4
(char)0x0:      1
(short)0x0:     2
(int)0x0:       4
(long)0x0:      4

যা আপনাকে সন্দেহ করে যে কোনও চরিত্রটি 8 বিট, তবে একটি অক্ষর আক্ষরিক অর্থে হয় sugges


7
আকর্ষণীয় হওয়ার জন্য +1। লোকেরা প্রায়শই মনে করে যে আকার ("ক") এবং মাপ ("") চর * এর এবং 4 (বা 8) দেওয়া উচিত। তবে বাস্তবে তারা চর [] এর সেই সময়ে (আকারের (চর [11]) 11 দেয়)। Newbies জন্য একটি ফাঁদ।
paxdiablo

3
একটি অক্ষর আক্ষরিক একটি ইনট হিসাবে প্রচার করা হয় না, এটি ইতিমধ্যে একটি int। যদি বস্তুটি মাপের অপারেটরের অপারেন্ড হয় তবে কোনও প্রচার চলছে না। যদি সেখানে থাকে তবে এটি আকারের উদ্দেশ্যকে পরাস্ত করবে।
ক্রিস ইয়ং

@ ক্রিস ইয়ং: ইয়া পরীক্ষা করে দেখুন। ধন্যবাদ।
ডিএমকেই --- প্রাক্তন মডারেটর বিড়ালছানা

8

যখন সি লেখা হচ্ছে, পিডিপি -11 এর ম্যাক্রো -11 এর সমাবেশের ভাষাটি ছিল:

MOV #'A, R0      // 8-bit character encoding for 'A' into 16 bit register

এই জাতীয় জিনিসটি ভাষা ভাষায় প্রচলিত - কম 8 টি বিট অক্ষর কোডটি ধারণ করবে, অন্যান্য বিটগুলি 0 থেকে সাফ হয়ে গেছে PD পিডিপি -11 এমনকি ছিল:

MOV #"AB, R0     // 16-bit character encoding for 'A' (low byte) and 'B'

এটি 16 বিট রেজিস্ট্রারের নিম্ন এবং উচ্চ বাইটে দুটি অক্ষর লোড করার জন্য একটি সুবিধাজনক উপায় সরবরাহ করেছে। এরপরে আপনি এগুলি অন্য কোথাও লিখতে পারেন, কিছু পাঠ্যগত ডেটা বা স্ক্রিন মেমরি আপডেট করে।

সুতরাং, আকারগুলি নিবন্ধের জন্য চরিত্রগুলি প্রচার করার ধারণাটি বেশ স্বাভাবিক এবং আকাঙ্ক্ষিত। তবে, ধরা যাক আপনাকে হার্ড-কোডড অপকোডের অংশ হিসাবে নয়, তবে কোথাও থেকে মূল স্মৃতিতে এমন একটি রেজিস্টারে 'এ' পাওয়া দরকার:

address: value
20: 'X'
21: 'A'
22: 'A'
23: 'X'
24: 0
25: 'A'
26: 'A'
27: 0
28: 'A'

আপনি যদি এই মূল স্মৃতি থেকে একটি রেজিস্টারে কেবল একটি 'এ' পড়তে চান তবে আপনি কোনটি পড়বেন?

  • কিছু সিপিইউ কেবলমাত্র 16 বিট রেজিস্টারে একটি 16 বিট মান পড়তে সরাসরি সমর্থন করতে পারে, যার অর্থ 20 বা 22 এ পড়ার পরে 'এক্স' থেকে বিটগুলি সাফ করা প্রয়োজন হবে এবং সিপিইউ এক বা অন্যটির শেষতার উপর নির্ভর করে লো অর্ডার বাইটে স্থানান্তর করা দরকার।

  • কিছু সিপিইউগুলির জন্য একটি মেমরি-প্রান্তিক পাঠকের প্রয়োজন হতে পারে যার অর্থ হ'ল জড়িত সর্বনিম্ন ঠিকানা অবশ্যই ডেটা আকারের একাধিক হতে হবে: আপনি 24 এবং 25 ঠিকানা থেকে পড়াতে সক্ষম হতে পারেন তবে 27 এবং 28 নয়।

সুতরাং, একটি সংকলক উত্পাদক কোডটি রেজিস্টারে একটি 'এ' পেতে কিছুটা অতিরিক্ত মেমরি নষ্ট করতে পছন্দ করতে পারে এবং 0 'এ' বা 'এ' 0 হিসাবে মান এনকোড করতে পারে - এন্ডিয়ানাটির উপর নির্ভর করে এবং এটি সঠিকভাবে প্রান্তিককরণ নিশ্চিত করে ( অর্থাত্‍ বিজোড় মেমরি ঠিকানায় নয়)।

আমার ধারণা হ'ল সি এর কেবলমাত্র সিপিইউ কেন্দ্রিক আচরণের এই স্তরটি বহন করে, রেজিস্টার আকারের মেমরির অধিকারী চরিত্রের ধ্রুবকদের কথা চিন্তা করে, সি এর সাধারণ মূল্যায়নকে "উচ্চ স্তরের এসেমব্লার" হিসাবে বহন করে।

( Http://www.dmv.net/dec/pdf/macro.pdf এর 6-25 পৃষ্ঠাতে 6.3.3 দেখুন )


5

আমার মনে আছে কে এন্ড আর পড়া এবং এমন একটি কোড স্নিপেট যা EF এ আঘাত না হওয়া অবধি একসময় কোনও অক্ষর পড়বে। যেহেতু সমস্ত অক্ষর কোনও ফাইল / ইনপুট স্ট্রিমে থাকা বৈধ অক্ষর, এর অর্থ EOF এর কোনও মান মূল্য হতে পারে না। কোডটি যা করেছিল তা হল পঠিত চরিত্রটিকে একটি অন্তর্নিহিত করা, তারপরে ইওএফের জন্য পরীক্ষা করা, তারপরে এটি যদি না হয় তবে চরে রূপান্তর করা।

আমি বুঝতে পেরেছি এটি আপনার প্রশ্নের সঠিক উত্তর দেয় না, তবে ইওএফ আক্ষরিক হলে অক্ষরের বাকী অক্ষরগুলির আকার হবে (ইন্ট) some

int r;
char buffer[1024], *p; // don't use in production - buffer overflow likely
p = buffer;

while ((r = getc(file)) != EOF)
{
  *(p++) = (char) r;
}

আমি মনে করি না যদিও 0 একটি বৈধ অক্ষর।
gbjbaanb

3
@ জিবিজেবায়ানব: অবশ্যই এটা নাল চরিত্র। চিন্তা করুন. আপনি কি মনে করেন কোনও ফাইলকে কোনও শূন্য বাইট ধারণ করার অনুমতি দেওয়া উচিত নয়?
পি ড্যাডি

1
উইকিপিডিয়া পড়ুন - "ইওএফের আসল মান হ'ল একটি সিস্টেম-নির্ভর নেতিবাচক সংখ্যা, সাধারণত -1, যা কোনও বৈধ অক্ষর কোডের সাথে অসম হিসাবে গ্যারান্টিযুক্ত।"
ম্যালেক্স

2
যেমন ম্যালেক্স বলেছে - ইওএফ কোনও চরের টাইপ নয় - এটি কোনও প্রকারের টাইপ। getchar () এবং বন্ধুরা কোনও int ফিরিয়ে দেয়, যা কোনও বিরোধের পাশাপাশি ইওএফ হিসাবে যে কোনও চর ধরে রাখতে পারে। এর জন্য প্রকৃতপক্ষে টাইপ ইন্টের জন্য আক্ষরিক অক্ষরের প্রয়োজন হবে না।
মাইকেল বারার

2
EOF == -1 সি এর চরিত্রের ধ্রুবকের অনেক পরে এসেছিল, সুতরাং এটি কোনও উত্তর নয় এমনকি প্রাসঙ্গিকও নয়।
জিম বাল্টার

5

আমি এর জন্য কোনও যুক্তি দেখিনি (সি চর অক্ষরগুলি ইনট টাইপ হওয়া), তবে স্ট্রস্ট্রাপকে এটি সম্পর্কে কিছু বলতে হয়েছিল (নকশা এবং বিবর্তন 11.2.1 - ফাইন-গ্রান রেজোলিউশন থেকে):

সি, এই ধরনের আক্ষরিক একটি অক্ষর টাইপ হিসাবে 'a'হয় int। আশ্চর্যের বিষয়, সি ++ এ 'a'টাইপ দেওয়া charকোনও সামঞ্জস্যের সমস্যা সৃষ্টি করে না। প্যাথলজিকাল উদাহরণ ব্যতীত sizeof('a'), সি এবং সি ++ উভয় ক্ষেত্রেই প্রকাশ করা যেতে পারে এমন প্রতিটি নির্মাণ একই ফলাফল দেয়।

সুতরাং বেশিরভাগ ক্ষেত্রে এটি কোনও সমস্যা না করে।


মজাদার! কিন্ডার সি স্ট্যান্ডার্ড কমিটি "বুদ্ধিমানভাবে" সি থেকে এই
তর্কটি

2

এর historicalতিহাসিক কারণ হ'ল সি এবং এর পূর্বসূরি বি প্রকৃতপক্ষে ডিইসি পিডিপি মিনিকম্পিউটারের বিভিন্ন মডেলের বিভিন্ন শব্দের আকারের সাথে বিকাশ করেছিল যা 8-বিট এএসসিআইআই সমর্থন করেছিল তবে কেবল রেজিস্টারে গাণিতিক সম্পাদন করতে পারে। (পিডিপি -১১ নয়, তবে এটি পরে এসেছিল)) সি এর প্রাথমিক সংস্করণগুলি intমেশিনের নেটিভ শব্দের আকার হিসাবে সংজ্ঞায়িত হয়েছে এবং কোনও ফাংশনে যাওয়ার বা পাস করার জন্য কোনও মানকে প্রস্থের চেয়ে ছোট করা intদরকার int, বা কিছুটা যুক্তিযুক্ত বা গাণিতিক অভিব্যক্তিতে ব্যবহৃত হয়েছে, কারণ অন্তর্নিহিত হার্ডওয়্যারটি এভাবেই কাজ করত।

এজন্যই পূর্ণসংখ্যার প্রচারের বিধিগুলি এখনও বলে যে এর চেয়ে ছোট কোনও ডেটা টাইপ intপ্রচার করা হয় int। সি বাস্তবায়নের ক্ষেত্রে অনুরূপ historicalতিহাসিক কারণে দু'জনের পরিপূরকের পরিবর্তে কারও পরিপূরক গণিত ব্যবহার করার অনুমতি রয়েছে। হেক্সের তুলনায় অষ্টাল চরিত্রটি পালিয়ে যাওয়ার এবং অষ্টক ধ্রুবকগুলি প্রথম শ্রেণির নাগরিক হওয়ার কারণ একইভাবে those ডিসি মিনিক কম্পিউটারগুলির শব্দের আকারগুলি তিন বাইট খণ্ডে বিভাজ্য ছিল তবে চার-বাইট নিবল নয়।


... এবং charহুবহু 3 টি অক্টাল ডিজিট দীর্ঘ ছিল
অ্যান্টি হাপালা

1

এটি সঠিক আচরণ, যাকে "অবিচ্ছেদ্য প্রচার" বলা হয়। এটি অন্যান্য ক্ষেত্রেও ঘটতে পারে (প্রধানত বাইনারি অপারেটরগুলি, যদি আমি সঠিকভাবে মনে করি)।

সম্পাদনা করুন: ঠিক নিশ্চিত হতে, আমি আমার কপি চেক করা এক্সপার্ট সি প্রোগ্রামিং: ডিপ সিক্রেটস , এবং আমি নিশ্চিত করেছে যে একটি গৃহস্থালি আক্ষরিক নেই দিয়ে শুরু একটি টাইপ int- এ । এটি প্রাথমিকভাবে টাইপ চরের হয় তবে যখন এটি কোনও অভিব্যক্তিতে ব্যবহৃত হয় তখন এটি কোনও ইনট হিসাবে প্রচার করা হয় । নিম্নলিখিতটি বইটি থেকে উদ্ধৃত হয়েছে:

চরিত্রের আক্ষরিকের টাইপ ইন্ট থাকে এবং তারা টাইপ চর থেকে প্রচারের নিয়মগুলি অনুসরণ করে সেখানে পৌঁছে। এটি 39 page পৃষ্ঠায় কেএন্ডআর 1-তে খুব সংক্ষেপে কভার করা হয়েছে যেখানে বলা হয়েছে:

একটি এক্সপ্রেশন প্রতিটি চর একটি int রূপান্তরিত হয় .... লক্ষ্য করুন যে একটি এক্সপ্রেশন মধ্যে সমস্ত ভাসমান এর দ্বিগুণ রূপান্তরিত হয় .... যেহেতু একটি ফাংশন আর্গুমেন্ট একটি অভিব্যক্তি, আর্গুমেন্ট ফাংশন থেকে পাস করার সময় টাইপ রূপান্তরও ঘটে: বিশেষত, চর এবং সংক্ষিপ্ত হয়ে ওঠে, ভাসমান দ্বিগুণ হয়ে যায়।


যদি অন্য মন্তব্যগুলির বিশ্বাস করা হয়, তবে 'a' এক্সপ্রেশনটি টাইপ ইনট দিয়ে শুরু হয় - কোনও আকারের () এর ভিতরে কোনও প্রকার প্রচার করা হয় না। এটি 'এ' টাইপ ইন্ট কেবল সি এর এক ধাক্কায় মনে হয়।
j_random_hacker

2
একটি গৃহস্থালি আক্ষরিক করে টাইপ int- আছে। এএনএসআই / আইএসও 99 স্ট্যান্ডার্ড তাদেরকে 'পূর্ণসংখ্যার চরিত্রের ধ্রুবক' বলে ডাকে (তাদেরকে 'প্রশস্ত চরিত্রের ধ্রুবকগুলি থেকে আলাদা করতে, যাদের টাইপ উইচার_টি রয়েছে) এবং স্পষ্টভাবে বলেছে, "একটি পূর্ণসংখ্যার চরিত্রের ধ্রুবকের টাইপ ইন্ট থাকে" "
মাইকেল

আমি যেটা বোঝাতে চাইছিলাম তা এটি টাইপ ইন্ট দিয়ে শুরু হয় না , বরং চর থেকে কোনও রূপান্তরিত হয় (উত্তর সম্পাদিত)। অবশ্যই, এটি সম্ভবত সংকলক লেখক ব্যতীত অন্য কাউকে উদ্বেগ দেয় না যেহেতু রূপান্তরটি সবসময়ই হয়ে থাকে।
পলিথিংকার

3
না! আপনি যদি এএনএসআই / আইএসও 99 সি স্ট্যান্ডার্ডটি পড়েন তবে আপনি দেখতে পাবেন যে সিতে 'a' এক্সপ্রেশনটি টাইপ int দিয়ে শুরু হয় । আপনার যদি কোনও ফাংশন অকার্যকর f (int) এবং একটি ভেরিয়েবল চর সি হয়, তবে f (c) অবিচ্ছেদ্য প্রচার করবে তবে f ('a') 'a' টাইপটি ইতিমধ্যে অন্তর্নিহিত হিসাবে থাকবে না । অদ্ভুত কিন্তু সত্য.
j_random_hacker

2
"কেবল নিশ্চিত হতে" - আপনি আসলে এই বিবৃতিটি পড়ে আরও নিশ্চিত হতে পারেন: "চরিত্রের অক্ষরে অক্ষরে টাইপ থাকে"। "আমি কেবল এটিই নিরব পরিবর্তনগুলির মধ্যে একটি বলে ধরে নিতে পারি" - আপনি ভুলভাবে ধরে নিয়েছেন। সি-এর অক্ষরগুলির অক্ষর সর্বদা টাইপ হয় of
জিম বাল্টার

0

আমি জানি না, তবে আমি অনুমান করতে যাচ্ছি যে সেভাবে এটি কার্যকর করা সহজ ছিল এবং এটি আসলে কোনও ব্যাপার নয়। এটি সি ++ অবধি ছিল না যখন টাইপটি নির্ধারণ করতে পারে যে কোন ফাংশনটি এটি কল করা দরকার তা কল করা হবে।


0

আমি আসলে এটি জানতাম না। প্রোটোটাইপগুলির অস্তিত্বের আগে, কার্যকারিতার আর্গুমেন্ট হিসাবে এটি ব্যবহার করার সময় কোনও int এর চেয়ে সংকীর্ণকে কোনও int এ রূপান্তরিত করা হয়। এটি ব্যাখ্যার অংশ হতে পারে।


1
আরেকটি দরিদ্র "উত্তর"। স্বয়ংক্রিয় রূপান্তর charকরতে intএটা বেশ হবে অপ্রয়োজনীয় চরিত্র ধ্রুবক আছে ints আছি। কী প্রাসঙ্গিক তা হ'ল ভাষাটি charভেরিয়েবল থেকে চরিত্রের স্থিরতাটিকে আলাদাভাবে আচরণ করে (তাদের আলাদা আলাদা ধরণের দিয়ে) , এবং যা প্রয়োজন তা সেই পার্থক্যের ব্যাখ্যা।
জিম বাল্টার

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

0

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

এটি একাডেমিক পয়েন্টের ধরণের কারণ ভাষাটি যে কোনও উপায়ে একটি 8-বিট আক্ষরিক ধরণ নির্দিষ্ট করতে পারে, তবে এই ক্ষেত্রে সিপিইউ আসলে কী করছে তা ভাষা নিদর্শনটি আরও ঘনিষ্ঠভাবে প্রতিবিম্বিত করে।

(x86 উইঙ্কস নোট করতে পারে যে যেমন একটি নেটিভ অ্যাড অপ আছে যা একটি ধাপে সংক্ষিপ্ত-প্রশস্ত রেজিস্টারগুলিকে যুক্ত করে, তবে আরআইএসসি কোরের অভ্যন্তরে এটি দুটি ধাপে অনুবাদ করে: সংখ্যা যুক্ত করুন, তারপরে চিহ্নটি প্রসারিত করুন, যেমন একটি অ্যাড / এক্সটেশ জুটির মতো পাওয়ারপিসি)


1
তবুও অন্য একটি ভুল উত্তর। অক্ষর আক্ষরিক এবং charভেরিয়েবলের বিভিন্ন ধরণের কেন তা এখানে সমস্যা issue স্বয়ংক্রিয় প্রচারগুলি, যা হার্ডওয়্যারকে প্রতিবিম্বিত করে, প্রাসঙ্গিক নয় - এগুলি প্রকৃতপক্ষে বিরোধী প্রাসঙ্গিক কারণ charভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে প্রচারিত হয় যাতে চরিত্রের অক্ষরগুলি টাইপ না হওয়ার কোনও কারণ নেই char। আসল কারণটি হ'ল মাল্টিবাইট আক্ষরিক, যা এখন অপ্রচলিত।
জিম বাল্টার

@ জিম বাল্টার মাল্টিবাইট লেটারেলগুলি মোটেই অপ্রচলিত নয়; মাল্টিবাইট ইউনিকোড এবং ইউটিএফ অক্ষর রয়েছে।
ক্র্যাশ ওয়ার্কস

@ ক্র্যাশওয়ার্কস আমরা মাল্টিবাইট চরিত্রের অক্ষরগুলির কথা বলছি, মাল্টবাইট স্ট্রিং লিটারালগুলি নয় । মনোযোগ দেওয়ার চেষ্টা করুন।
জিম বাল্টার

4
ক্র্যাশওয়ার্কস চরিত্র লিখতেন । আপনার উচিত ছিল যে প্রশস্ত চরিত্রের আক্ষরিক (L'। বলে) বেশি বাইট নেয় তবে তাদের মাল্টিবাইট চর অক্ষর বলা হয় না। অহঙ্কারী হওয়া আপনাকে নিজেকে আরও নির্ভুল হতে সাহায্য করবে।
ব্লেসরব্ল্যাড

@ ব্লাইজারব্ল্যাড ওয়াইড চরিত্রের অক্ষরগুলি এখানে প্রাসঙ্গিক নয় - আমি যা লিখেছি তার সাথে তাদের কিছু করার নেই। আমি নির্ভুল ছিলাম এবং আপনার বোঝার অভাব রয়েছে এবং আমাকে সংশোধন করার আপনার জালিয়াতি প্রচেষ্টা হ'ল অহঙ্কারী।
জিম বাল্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.