স্ট্যান্ড :: সংখ্যাসূচক_মিলিট <স্বাক্ষরবিহীন চর> সদস্যদের কাছে কল করার আগে অবিচলিত “+” এর উদ্দেশ্য কী?


130

আমি cppreferences এর ডকুমেন্টেশনের জন্য এই উদাহরণটি দেখেছিstd::numeric_limits

#include <limits>
#include <iostream>

int main() 
{
    std::cout << "type\tlowest()\tmin()\t\tmax()\n\n";

    std::cout << "uchar\t"
              << +std::numeric_limits<unsigned char>::lowest() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::min() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::max() << '\n';
    std::cout << "int\t"
              << std::numeric_limits<int>::lowest() << '\t'
              << std::numeric_limits<int>::min() << '\t'
              << std::numeric_limits<int>::max() << '\n';
    std::cout << "float\t"
              << std::numeric_limits<float>::lowest() << '\t'
              << std::numeric_limits<float>::min() << '\t'
              << std::numeric_limits<float>::max() << '\n';
    std::cout << "double\t"
              << std::numeric_limits<double>::lowest() << '\t'
              << std::numeric_limits<double>::min() << '\t'
              << std::numeric_limits<double>::max() << '\n';
}

আমি "+" অপারেটরটিকে বুঝতে পারি না

<< +std::numeric_limits<unsigned char>::lowest()

আমি এটি পরীক্ষা করেছি, এটিকে "-" দিয়ে প্রতিস্থাপন করেছি এবং এটিও কার্যকর হয়েছে। এই জাতীয় "+" অপারেটরের ব্যবহার কী?


3
চেষ্টা করে দেখুন আপনি যদি ছেড়ে যান তবে আপনি কী পাবেন +?
পিট বেকার


আপনি যদি এর সাথে প্রতিস্থাপন করেন -তবে আউটপুটগুলি সীমাবদ্ধতার জন্য সঠিক মান হবে না
ফুচলভি

1
রেকর্ডের জন্য, আপনি যদি গুগলকে নিজের মধ্যে এই জিনিসটি চান তবে এটিকে "আনরি প্লাস" অপারেটর বলা হয় - এটি অখণ্ড কারণ এটি একক মান নেয় (এই ক্ষেত্রে এটি ঠিক পরে জিনিসটি) এবং "প্লাস" "হ'ল গুগল-বান্ধব উপায় +। এই ক্ষেত্রে, আপনার ক্যোয়ারী সম্ভবত "সি ++ অ্যানারি প্লাস" হবে। এটি ... হুবহু স্বজ্ঞাত নয়, এবং আপনাকে যে ডকুমেন্টেশনগুলি পাওয়া যাবে তা এখনও শিখতে হবে, তবে আইএমও এটি চাষ করার জন্য একটি দক্ষ দক্ষতা।
মনিকা এর মামলা মোকদ্দমা করুন

উত্তর:


137

<<একটি char(স্বাক্ষরিত বা স্বাক্ষরযুক্ত) পাস করার পরে আউটপুট অপারেটর একটি অক্ষর হিসাবে এটি লিখবে ।

যারা ফাংশন টাইপ মান ফিরে আসবে unsigned char। এবং উপরে উল্লিখিত হিসাবে এটি সেই মানগুলি বর্তমান এনকোডিংয়ে প্রতিনিধিত্ব করে, তাদের পূর্ণসংখ্যার মানগুলি মুদ্রণ করবে।

+অপারেটর ধর্মান্তরিত unsigned charএকটি সেই ফাংশন দ্বারা ফিরে intমাধ্যমে পূর্ণসংখ্যা প্রচার । যার অর্থ হল পূর্ণসংখ্যার মানগুলি পরিবর্তে মুদ্রিত হবে।

মত একটি অভিব্যক্তি +std::numeric_limits<unsigned char>::lowest()মূলত সমান static_cast<int>(std::numeric_limits<unsigned char>::lowest())


37

+সেখানে ঘুরে হয় unsigned charএকটি মধ্যে int+অপারেটর মান সংরক্ষণের, কিন্তু এটা তার প্রতীক উপর অবিচ্ছেদ্য প্রচার দেখা দেওয়ার প্রভাব রয়েছে। এটি নিশ্চিত করার জন্য যে আপনি কয়েকটি (অর্ধ-) এলোমেলো চরিত্রের পরিবর্তে একটি সংখ্যাসূচক মান দেখতে পেয়েছেন operator <<যা কোনও অক্ষরের প্রকারের সময় প্রিন্ট হবে।


18

ইতিমধ্যে দেওয়া উত্তরগুলিতে একটি রেফারেন্স যুক্ত করতে। সিপিপি স্ট্যান্ডার্ড ওয়ার্কিং ড্রাফট এন 4713 থেকে :

৮.৫.২.২ ইউনারি অপারেটর
...

  1. অ্যানারি + অপারেটরের অপারেন্ডে পাটিগণিত, আনস্কোপড গণনা, বা পয়েন্টার টাইপ থাকবে এবং ফলাফলটি আর্গুমেন্টের মান। ইন্টিগ্রাল প্রচারটি ইন্টিগ্রাল বা এনুমুরেশন অপারেন্ডগুলিতে সম্পাদিত হয়। ফলাফলের ধরণটি হ'ল প্রচারিত অপারেন্ডের ধরণ।

আর char, short, int, এবং longঅবিচ্ছেদ্য ধরনের হয়।


12

+ফলাফল ছাড়া ভিন্ন হবে। a 97পরিবর্তে নিম্নলিখিত স্নিপেট আউটপুটa a

char ch = 'a';
std::cout << ch << ' ' << +ch << '\n';

কারণ হ'ল বিভিন্ন ওভারলোডগুলি বিভিন্ন ধরণের ডেটা প্রিন্ট করে । এর জন্য কোনও basic_ostream& operator<<( char value );ওভারলোড নেই std::basic_ostreamএবং এটি পৃষ্ঠার শেষে ব্যাখ্যা করা হয়েছে

ক্যারেক্টার এবং চরিত্র স্ট্রিং আর্গুমেন্ট (যেমন, টাইপ charবা const char*) দ্বারা পরিচালনা করা হয় অ সদস্য overloads এর operator<<। সদস্য ফাংশন কল সিনট্যাক্স (উদাহরণস্বরূপ std::cout.operator<<('c');) ব্যবহার করে একটি অক্ষর আউটপুট দেওয়ার চেষ্টা করা হলে ওভারলোডগুলির মধ্যে একটি (2-4) কল করবে এবং সংখ্যার মান আউটপুট করবে । সদস্য ফাংশন কল সিনট্যাক্স ব্যবহার করে একটি চরিত্রের স্ট্রিং আউটপুট দেওয়ার চেষ্টা করা হলে ওভারলোড (7) কল করবে এবং পরিবর্তে পয়েন্টারটির মান মুদ্রণ করবে।

অ সদস্য জমিদার যে যখন আপনি পাস একটি ডাকা হবে charপরিবর্তনশীল

template< class CharT, class Traits> basic_ostream<CharT,Traits>& operator<<(
    basic_ostream<CharT,Traits>& os, char ch );

যা কোডপয়েন্টে চরিত্রটি মুদ্রণ করে ch

তাই মূলত যদি আপনি পাস char, signed charঅথবা unsigned charসরাসরি প্রবাহে এটা চরিত্র প্রিন্ট আউট করব। যদি আপনি +উপরের রেখাগুলি অপসারণের চেষ্টা করেন তবে আপনি দেখতে পাবেন এটি কিছু "অদ্ভুত" বা অ-দৃশ্যমান অক্ষর মুদ্রণ করে যা কারও প্রত্যাশা নয়

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

এমন অনেক লোক আছেন যারা এই সমস্যাটির মুখোমুখি হন like


1
আপনি কি বোঝাতে চেয়েছেন একাকার প্লাস , বিয়োগ নয়?
রুসলান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.