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


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.htrueএবং 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.