বুলেট থেকে ইন রূপান্তর


131

এই রূপান্তরটি কতটা পোর্টেবল। আমি নিশ্চিত হতে পারি যে উভয় দাবিই উত্তীর্ণ হয়েছে?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

কেন জিজ্ঞাসা করবেন না। আমি জানি এটি কুৎসিত। ধন্যবাদ.


আপনার প্রথম প্রকাশটি কেন পরিবর্তন হয় না? আপনি লিখতে পারেন assert(x!=0)। এমনকি যদি বুল (সত্য) পোর্টেবলকে ইনট (1) এ রূপান্তর করে তবে "মিথ্যা নয়" দৃ as়পদগুলির আরও বেশি পঠনযোগ্য এক্সপ্রেশন থাকে।
— হার্পার

1
কেন নয়: assert( 4 < 5);এবংassert(!( 4 > 5));
— মার্টিন ইয়র্ক

4
@ হার্পার: তুলনা অভিব্যক্তির প্রয়োজনীয় মান ব্যবহার করা পুরোপুরি যুক্তিসঙ্গত।
— আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

@ আর._ যখন প্রশ্নটি হয় যে যদি বুল-টু-ইন-রূপান্তরটি কোনও যুক্তিসঙ্গত ফলাফল দেয়, আমি এই বিষয়ে নির্ভর করব না। লেখক যখন সন্দেহ করেন যে এই প্রয়োজনীয়তাটি পূর্ণ হয় তবে পাঠকও একই সমস্যা পেতে পারেন। বিশেষত কারণ x এর মান পরীক্ষা করার শর্ত নয় তবে কেবলমাত্র একটি মধ্যবর্তী ফলাফল।
— হার্পার

3
আমি সম্ভবত লিখতে চাই (4 < 5) ? 1 : 0যদি আমার বুলিয়ানকে 0 বা 1 তে রূপান্তর করতে হয় তবে একটি ভাল সংকলক সম্ভবত একই মেশিন কোড তৈরি করবে এবং এটি একটি মানব পাঠকের জন্য আরও পরিষ্কার।
— অলব ২

উত্তর:


205
int x = 4<5;

সম্পূর্ণ পোর্টেবল। মানসম্পন্ন boolথেকে intরূপান্তর অন্তর্নিহিত হয়!

সি ++ স্ট্যান্ডার্ড থেকে §4.7 / 4 বলেছেন (ইন্টিগ্রাল রূপান্তর )

উত্সের ধরণটি যদি দুর্দান্ত হয় তবে মানটি falseশূন্যে রূপান্তরিত হয় এবং মানটি trueএকটিতে রূপান্তরিত হয় ।


সি হিসাবে, যেমন যতদূর আমি জানি সেখানে নেই boolসি (1999 আগে) সুতরাং boolকরতে intরূপান্তর শুধুমাত্র C ++ প্রাসঙ্গিক। সিতে, মূল্যকে 4<5মূল্যায়ন করে int, এই ক্ষেত্রে মানটি হয় 1, 4>5 যা মূল্যায়ন করবে 0।

সম্পাদনা: মন্তব্যে জেনস বলেছেন, সি 99 এর _Boolটাইপ রয়েছে। শিরোনাম ফাইলে boolসংজ্ঞায়িত করা একটি ম্যাক্রো stdbool.h। trueএবং falseএছাড়াও ম্যাক্রো সংজ্ঞায়িত করা হয় stdbool.h।

সি 99 এর থেকে .17.16 বলছে,

ম্যাক্রো bool_ বুলে প্রসারিত হয়।

[..] trueযা পূর্ণসংখ্যার ধ্রুবক পর্যন্ত প্রসারিত হয় 1, falseযা পূর্ণসংখ্যার ধ্রুবরে প্রসারিত হয় 0, [..]


3
নিশ্চিত হয়ে নিন যে bool১৯৯৯ সাল থেকে সি-তে রয়েছে Just "stdbool.h" শিরোনামটি ব্যবহার করুন এবং এটি অন্তর্ভুক্ত করা উচিত।
— জেনস গুস্ট্ট

1
প্রকৃতপক্ষে, আমি এটি কয়েকটি সংকলকগুলিতে পরীক্ষা করেছি এবং এটি বহনযোগ্য বলে মনে হচ্ছে।
— pic11

8
সি ভাষার সংস্করণ এবং bool/ _Boolপ্রকারের উপলভ্যতা নির্বিশেষে, সি উত্পাদনে সম্পর্কিত অপারেটরগুলি intনয় bool। এমনকি সি 99 এও, রিলেশনাল অপারেটরগুলি এখনও উত্পাদন করে int।
— অ্যান্ট

51

আপনি একই সাথে আপনার প্রশ্ন [সি] এবং [সি ++] ট্যাগ করেছেন। ফলাফলগুলি ভাষার মধ্যে সামঞ্জস্যপূর্ণ হবে তবে উত্তরের কাঠামো এই ভাষার প্রতিটিটির জন্যই আলাদা।

সি ভাষায় আপনার উদাহরণগুলির সাথে কোনও সম্পর্ক boolনেই (এটি C99-তেও প্রযোজ্য)। সি ভাষায় রিলেশনাল অপারেটর boolফল দেয় না । উভয় 4 > 5এবং হ'ল 4 < 5অভিব্যক্তি যা intমানগুলির সাথে টাইপের ফলাফল দেয় 0বা 1। সুতরাং, সি তে আপনার উদাহরণগুলিতে কোনও ধরণের কোনও "বোল টু রূপান্তর" নেই

সি ++ সম্পর্কিত রিলেশনাল অপারেটররা boolফলস্বরূপ ফলাফল দেয়। রূপান্তরিত এবং রূপান্তরকরণের সাথে boolমানগুলি intটাইপে রূপান্তরিত হয় । এটি ভাষা দ্বারা গ্যারান্টিযুক্ত।true1false0

পি সি সি ল্যাঙ্গুয়েজে ডেডিকেটেড বুলিয়ান _Boolটাইপও রয়েছে (ম্যাক্রো-এলিয়াসেড হিসাবে bool), এবং এর অবিচ্ছেদ্য রূপান্তর নিয়মগুলি মূলত সি ++ এর মতোই are তবে তবুও এটি সিতে আপনার নির্দিষ্ট উদাহরণগুলির সাথে প্রাসঙ্গিক নয়, আবার সি এর সাথে সম্পর্কিত অপারেটররা সর্বদা ভাষা নির্দিষ্টকরণের সংস্করণ নির্বিশেষে ফলাফল তৈরি করে int(না bool)।


2
এটি ঠিক আছে, কেএন্ডআর সি তে কোনও বুল নেই আমি আমার প্রশ্নটিকে C99 হিসাবে আবার ট্যাগ করেছি।
— pic11

@ পিক 11: কোনও কিছুর পুনরায় আরম্ভ করার দরকার ছিল না। কেএন্ডআর বা অন্য কোনও সি এর boolসাথে এর কোনও যোগসূত্র নেই যদিও সি 99 তে রয়েছে, রিলেশনাল অপারেটরগুলি এখনও intসি 99 এ উত্পাদন করে, না bool। সুতরাং, যদি এটি নির্দিষ্টভাবে সম্পর্কিত অপারেটর হয় তবে আপনি আগ্রহী (যেমন আপনার উদাহরণ হিসাবে) তবে ইস্যুটির এখনও কিছুই করার নেই bool।
— অ্যান্ট

এখন আমি এটি পেয়েছি। সম্পর্ক অপারেটরের ফলাফল অন্তর্নিহিতভাবে রূপান্তরিত করতে পারে। এটি সি, সি 99 এবং সি ++ এ সত্য। আবার ট্যারেজড।
— pic11

3
@ পিক 11: না, আপনি এটি পাবেন না। সি, সি 99 সহ, তুলনা অপারেটরের ফলাফল একটি int, একটি নয় bool। কোনও রূপান্তর ঘটে না।
— আর .. গীটহাব বন্ধ করুন ICE

এমন কোনও মানদণ্ড-অনুসরনযোগ্য উপায় আছে যার মাধ্যমে কোনও ভাষার এমন কোনও ধরন থাকতে পারে যা আচরণ করে boolতবে তার ঠিকানা গ্রহণের অনুমতি দেয় না? অনেক এম্বেড থাকা সিস্টেম এ জাতীয় ধরণের ব্যবহার করে (প্রায়শই শনাক্তকারী ব্যবহার করে ঘোষণা করা হয় bit)। উদাহরণস্বরূপ, মিড-রেঞ্জের পিআইসি, if (bitVar1) bitVar2=1;দুটি নির্দেশ থাকবে; এর জন্য অনুকূল কোডিং if (byteVar1) byteVar2=1;কমপক্ষে চারটি হবে (অনেকগুলি সংকলক, সম্ভবত পাঁচটি)। এই জাতীয় ধরণগুলি এইভাবে একটি বড় কর্মক্ষমতা বৃদ্ধি করতে পারে।
— সুপারক্যাট

17

সি স্ট্যান্ডার্ডের 6.৫.৮. says বলছে:

অপারেটরগুলির প্রত্যেকটি <(এর চেয়ে কম),> (এর চেয়ে বড়), <= (এর চেয়ে কম বা সমান) এবং> = (এর চেয়ে বড় বা সমান) নির্দিষ্ট সম্পর্কটি সত্য হলে 1 এবং যদি 0 হয় মিথ্যা।) ফলাফলের প্রকারের প্রকার আছে।


রেফারেন্সের জন্য ধন্যবাদ। Trueতিহাসিক কারণে এটি সত্য == 1 বলে মনে হচ্ছে।
— pic11

2

ইন্ট টু বুল কাস্ট সুস্পষ্টভাবে সম্পন্ন হওয়ার পরে কোনও সমস্যা নেই বলে মনে হচ্ছে। এটি মাইক্রোসফ্ট ভিজ্যুয়াল সি ++, জিসিসি এবং ইন্টেল সি ++ সংকলকটিতে কাজ করে। সি বা সি ++ তে কোনও সমস্যা নেই।


2
"এটি কিছু ক্ষেত্রে কাজ করে" বিশেষত tools সরঞ্জামগুলির অনির্দিষ্ট সংস্করণগুলির সাথে সঠিকতা যাচাই করার পক্ষে ভাল উপায় নয়। আমি অন্যান্য উত্তরে পদ্ধতির পছন্দ করি; তারা কোনও নির্দিষ্ট প্রয়োগ বাস্তবায়ন সঠিক হওয়ার গ্যারান্টি দিতে পারে না, তবে সঠিক বাস্তবায়ন কী করবে তা তারা গ্যারান্টি দিতে পারে।
— ম্যাথু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.