আমি কি কোনও সি ++ সংকলকটির জন্য সত্য (=) সত্য == (অন্তর্নিহিত) 1 ধরে নিতে পারি?


118

আমি কি (bool)true == (int)1কোনও সি ++ কম্পাইলারের জন্য ধরে নিতে পারি ?


3
আপনার প্রশ্নে থাকা কাস্টগুলি অপ্রয়োজনীয়, তাদের কি বিপরীত হওয়া উচিত?
GManNickG

9
তিনি তাদেরকে কাস্ট বলে বোঝাতে চাইছেন না, তার অর্থ হ'লbool t = true; int n = 1; if (t == n) {...} ;
এপ্রুনুনিন

7
@ ইগ্রুনিন: এহ, তবে সত্য এটি একটি বুল এবং 1 যাইহোক একটি অন্তর্নিহিত। :)
GManNickG

1
ঠিক আছে, আমি মানগুলির ধরণটি বোঝাতে চাইছিলাম।
পেট্রুজা

2
(int) trueহয় 1একটি পূর্ণসংখ্যা মান হিসাবে, কিন্তু কিছু যেমন if (pointer)তারপর অংশ যদি মাধ্যমে যায় pointer != 0। আপনি কেবল সত্য হিসাবে ধরে নিতে পারেন তা হ'ল false == 0, এবং true != 0(এবং কখন প্রেরণ করা হবে তার trueমূল্যায়ন )1int
লুইস কলোরাডো

উত্তর:


134

হ্যাঁ. কাস্টগুলি অপ্রয়োজনীয়। আপনার অভিব্যক্তিতে:

true == 1

ইন্টিগ্রাল প্রচার প্রযোজ্য এবং বিলের মান একটিতে প্রচারিত হবে intএবং এই প্রচারটি অবশ্যই 1 প্রদান করবে।

তথ্যসূত্র: ৪.7 [কনভিন্সেটগ্রাল] / ৪: উত্সের ধরণটি যদি bool... trueএক রূপান্তরিত হয়।


9
@ জোশুয়া: trueভাষা দ্বারা সংজ্ঞায়িত একটি কীওয়ার্ড। এটি একটি লাইব্রেরি দ্বারা নতুন সংজ্ঞা দেওয়া যাবে না। #defineএর কীওয়ার্ডগুলি নতুন করে সংজ্ঞায়িত করার অনুমতি নেই।
jalf

21
@ জাল্ফ: # সংজ্ঞায়িতদের সিস্টেমের কীওয়ার্ডগুলি সংজ্ঞায়িত করার পক্ষে অনুমোদিত। সি সংকলনের প্রাক-প্রসেসিং পর্বটি নিখুঁতভাবে পাঠ্যগত এবং সাধারণভাবে কীওয়ার্ড বা সি সিনট্যাক্সের কিছুই জানে না। তবুও, ভাষাশব্দগুলির কীওয়ার্ডগুলির নতুন সংজ্ঞা দেওয়ার জন্য এটি প্রায়শই খারাপ ধারণা is
ডেল হ্যাগলুন্ড 21

2
@jalf। তারা না? Gcc.gnu.org/onlinesocs/cpp/Macros.html দেখুন এবং আন্তর্জাতিক অবকাশিত সি কোড প্রতিযোগিতায় কমপক্ষে একটি এন্ট্রি দেখুন, যা একবার জিজ্ঞাসা করেছিল "কখন whileকিছুক্ষণ সময় নেয় না?" (উত্তর: যখন এটি দুটি পরামিতি নেয়, কারণ তখন সেই প্রবেশটি #definedএটিতে ছিল printf))
কেন ব্লুম

3
সি 99, §6.10.1 / 1 বলেছেন: "শর্তসাপেক্ষ অন্তর্ভুক্তি নিয়ন্ত্রণ করে এমন অভিব্যক্তিটি ব্যতীত পূর্ণসংখ্যক ধ্রুবক অভিব্যক্তি হতে পারে: এতে কোনও কাস্ট থাকবে না; শনাক্তকারীরা (কীওয়ার্ডের সাথে লাক্ষিকভাবে অভিন্ন) সহ নীচে বর্ণিত হিসাবে ব্যাখ্যা করা হয়েছে;" যদিও সরাসরি অনুমতি হিসাবে বলা হয়নি, এটি স্পষ্টভাবে ম্যাক্রোর সম্ভাব্যতার সাথে বিবেচনা করে যা কোনও কীওয়ার্ডের সাথে "লেক্সিকালি অভিন্ন"।
জেরি কফিন 21

2
ওহ, এবং # ডেফাইনগুলিকে কীওয়ার্ডগুলি নতুন করে সংজ্ঞায়িত করার অনুমতি দেওয়া হয়েছে। সি ++ 1x এর নতুন কীওয়ার্ডগুলির সাথে অনেকগুলি সমস্যা তৈরি করেছিল যাতে সেই প্রয়োজনটি সরিয়ে ফেলতে হয়েছিল।
জোশুয়া

18

চার্লস বেলির উত্তরটি সঠিক। সি ++ স্ট্যান্ডার্ড থেকে সঠিক শব্দটি হ'ল (.74.7 / 4): "উত্সের ধরণটি যদি ভুল হয় তবে মান মিথ্যাটিকে শূন্যে রূপান্তরিত করা হয় এবং মান সত্যকে একটিতে রূপান্তর করা হয়।"

সম্পাদনা: আমি দেখতে পাচ্ছি যে তিনি রেফারেন্সটিও যুক্ত করেছেন - আমি খুব শীঘ্রই এটিকে মুছে ফেলব, যদি আমি বিরক্ত না হয়ে ভুলে যাই ...

Edit2 তারপর আবার, এটি সম্ভবত লক্ষ করেন, বুলিয়ান নিজেদের মান যখন সবসময় শূন্য বা এক রূপান্তর মূল্য ফাংশন (বিশেষ করে সি মান লাইব্রেরি থেকে) প্রত্যাবর্তন মূল্যবোধের সংখ্যা হল "মূলত বুলিয়ান", কিন্তু হিসাবে প্রতিনিধিত্ব intগুলি আছে সাধারণত সঠিক হিসাবে ইঙ্গিত করতে মিথ্যা বা অ-শূন্যকে নির্দেশ করতে শূন্য হতে হবে। উদাহরণস্বরূপ, <ctype.h>শুধুমাত্র * শূন্য বা শূন্য-শূন্যের জন্য প্রয়োজনীয় * শুরুর প্রয়োজনগুলি শূন্য বা এক নয়।

আপনি যদি এটিটি কাস্ট করেন তবে boolশূন্যটি মিথ্যাতে রূপান্তরিত হবে, এবং শূন্যকে সত্যে রূপান্তরিত করবে (যেমনটি আপনি আশা করেছিলেন)।


9

স্ট্যান্ডার্ড অনুসারে আপনার সেই অনুমানের সাথে নিরাপদ থাকা উচিত। সি ++ boolটাইপের দুটি মান রয়েছে - trueএবং false1 এবং 0 এর সাথে সম্পর্কিত মান রয়েছে।

দেখার বিষয়টি হল boolএক্সপ্রেশন এবং ভেরিয়েবলের সাথে BOOLএক্সপ্রেশন এবং ভেরিয়েবলের মিশ্রণ । পরেরটিটিকে FALSE = 0এবং হিসাবে সংজ্ঞায়িত করা হয় TRUE != FALSE, যা প্রায়শই অনুশীলনে মানে 0 থেকে আলাদা কোনও মান বিবেচনা করা হয় TRUE

আধুনিক কম্পাইলার অনেক আসলে কোনো কোড যা পরোক্ষভাবে থেকে কাস্ট করার চেষ্টা করে জন্য একটি সতর্কবার্তা জারি করবে BOOLকরার boolযদি BOOLমান 0 বা 1 থেকে ভিন্ন।


3

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


3
এটি সি ++ এর জন্য একটি ভুল উত্তর, যেমন trueসংজ্ঞায়িত আচরণ সহ একটি ভাষা কীওয়ার্ড। আপনি পড়ুন যদি একটি সাধারণভাবে ম্যাক্রো যেমন সংজ্ঞায়িত TRUE, এটা সঠিক।
ডেভিড থর্নলি

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

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