কেন জাভা / সি ++ তে কোনও পাওয়ার অপারেটর নেই?


23

**পাইথনে এমন অপারেটর থাকাকালীন , আমি ভাবছিলাম যে জাভা এবং সি ++ কেন খুব একটা নেই।

অপারেটর ওভারলোডিংয়ের মাধ্যমে আপনি সি ++ তে যে ক্লাসগুলি নির্ধারণ করেছেন তার জন্য একটি তৈরি করা সহজ (এবং আমি বিশ্বাস করি জাভাতেও এ জাতীয় জিনিস সম্ভব) তবে আপনি লাইব্রেরি ব্যবহার করতে হবে যেমন ফাংশন Math.power(এবং সাধারণত উভয় দ্বিগুণ করতে হবে)।

সুতরাং - আদিম ধরণের জন্য এই জাতীয় অপারেটরকে সংজ্ঞায়িত করবেন না কেন?


8
সি ++ তে আমরা নিজের অপারেটর তৈরি করতে পারি না। আপনি কেবল বিদ্যমান অপারেটরদের ওভারলোড করতে পারেন।

1
@ মাহেশ, যাতে আমি একটি নিজস্ব হতে নিজের নম্বর বর্গ তৈরি করতে পারি এবং ওভারলোড ^ অপারেটর। যে বাস্তব সত্যই না।

22
@ রনজিলবার: এটি অপরিহার্য কারণ ^অপারেটরের অগ্রাধিকার ক্ষয়ক্ষতির নজিরের সাথে মেলে না। অভিব্যক্তি বিবেচনা করুন a + b ^ c। গণিতে, এক্সফোনেনটিশনটি প্রথমে ( b ^ c) সম্পাদিত হয় , তারপরে ফলস্বরূপ শক্তি যোগ করা হয় a। সি ++ এ, সংযোজনটি প্রথমে সম্পাদিত হয় ( a + b) তারপরে ^অপারেটরটি সঞ্চালিত হয় c। সুতরাং আপনি ^ক্ষয়ক্ষতি বোঝাতে অপারেটরটি বাস্তবায়ন করলেও , অগ্রাধিকারটি সবাইকে অবাক করে দেবে।
সিলিকোতে

2
@ র্যামজিলবার - ^সি ++ এর একটি এক্সওআর । এটি পরামর্শ দেওয়া হয় যে ওভারলোডেড অপারেটরটি কোনও আদিম ডেটা ব্যবহার করে যা আলাদা তা করা উচিত।

4
@ রানজিলবার: কারণ আপনি ক্ষয়ক্ষতি বোঝাতে যে অপারেটরগুলি উল্লেখ করেছেন সেগুলির মধ্যে কোনওটি ব্যবহার করা মোটেই স্বজ্ঞাত নয়। আমি ++অপারেটর বা অপারেটর এটকে ওভারলোড করে এমন কোনও সি ++ প্রোগ্রামারের দক্ষতার বিষয়ে গুরুত্ব সহকারে প্রশ্ন করব !। অল। অভিব্যক্তির অর্থ তবে আপনি যেভাবেই পারেন না, কারণ আপনি যে অপারেটরগুলির বিষয়ে কথা বলছেন তারা কেবল একটি যুক্তি স্বীকার করে; ক্ষতিকারক দুটি যুক্তি প্রয়োজন।
সিলিকো

উত্তর:


32

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

এছাড়াও, এটি আকারে ভাষার স্ট্যান্ডার্ড লাইব্রেরি সরবরাহ করে std::pow

পরিশেষে, পূর্ণসংখ্যার ডেটাটাইপগুলির জন্য এটি করা খুব বেশি অর্থবোধ করে না, কারণ ক্ষুদ্রাকৃতির জন্য সর্বাধিক এমনকি ছোট মানগুলি ইনট এর জন্য প্রয়োজনীয় পরিসীমাটি ফুটিয়ে তোলে, যা 65,535 অবধি রয়েছে। অবশ্যই, আপনি এটি ডাবলস এবং ফ্লোটের জন্য করতে পারেন তবে ইনটস নয়, তবে খুব কম ব্যবহৃত বৈশিষ্ট্যের জন্য ভাষাটিকে কেন বেমানান করবেন?


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

@ সায়ন: কমপক্ষে x86 এ, মডিউলাস একক নির্দেশ। ( DIVবিভাগ এবং মডুলাস উভয়ই করে) আপনি যদিও আমাকে ধারাবাহিকতার পয়েন্টে পেয়েছেন।
বিলি ওনিল

@ বিলি ওনিল: একক নির্দেশনায় ভাসমান পয়েন্ট মডুলাস? আমি আমার নিজের জন্য জানতে দেরী হিসাবে সমাবেশে কাছাকাছি না। যদি এটি হয় তবে মডেলাস অপারেটরটি ভাসমান পয়েন্টের ধরণের ক্ষেত্রে প্রযোজ্য হওয়া উচিত।

3
@ ডোনালফেলোস: ফিনট্রেনের বিগনাম সমর্থন সদৃশ যে কোনও কিছু হওয়ার আগে তার ক্ষয়ক্ষতি অপারেটর ছিল।
সুপারক্যাট

1
@ ডোনালফেলোস: একটি পাওয়ার অপারেটর যেমন ভাসমানগুলির মতো পূর্ণসংখ্যার সাথে কার্যকর হয় না, তবে ক্ষুদ্র শক্তিগুলির জন্য (বিশেষত স্কোয়ারিং) এর অবশ্যই এর ব্যবহার থাকতে পারে। ব্যক্তিগতভাবে আমি চিঠিগুলি ছাড়াই অপারেটরগুলি তৈরি করার পদ্ধতিকে পছন্দ করি (যেমন পাস্কাল তার সাথে divফোরট্রান দিয়ে থাকে .EQ.); ভাষার স্বেচ্ছাসেবী নিয়মের উপর নির্ভর করে, অপারেটরগুলির সংরক্ষণের শব্দগুলি প্রয়োজন না রেখে নির্বিচারে সংখ্যক অপারেটর থাকতে পারে।
সুপারক্যাট

41

এই প্রশ্নটি সি ++ এর জন্য উত্তরযোগ্য: স্ট্রাস্ট্রাপ, "সি ++ এর ডিজাইন এবং বিবর্তন" বিভাগ 11.6.1, পৃষ্ঠা 247-250 এ আলোচনা করেছে।

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

অপারেটরের পক্ষে ভাল প্রার্থী ছিল না। এবং এবং এবং এর মধ্যে সম্পর্কের কারণে ^একচেটিয়া-বা, এবং ^^আমন্ত্রণ বিভ্রান্তি । অনুপযুক্ত ছিল যেহেতু বিদ্যমান মানটিকে ক্ষতিকারকভাবে লেখার প্রাকৃতিক প্রবণতা থাকবে এবং এটি ইতিমধ্যে নেওয়া হয়েছিল। সর্বোত্তম উপলভ্য হতে পারে যা সম্ভবত দৃশ্যমান কেউ পছন্দ করেনি।&|&&||!!=*^

স্ট্রাস্ট্রপ **আবার বিবেচনা করা হয়, তবে এটি সি এর মধ্যে ইতিমধ্যে একটি অর্থ রয়েছে: a**pযা কিছু aসময়কে pনির্দেশ করে তার থেকে বহুগুণ বেশি এবং পয়েন্টারটিকে পয়েন্টার হিসাবে char ** c;ঘোষণা cকরে char**একটি টোকেন অর্থ হিসাবে পরিচয় করিয়ে দেওয়া হচ্ছে "পয়েন্টারটিকে পয়েন্টার ঘোষণার জন্য", "পরবর্তী বিষয়টি কীভাবে নির্দেশ করে" "(যদি এটি কোনও পয়েন্টার হয়)" বা "এক্সপেনসেন্টেশন" (যদি একটি সংখ্যার পরে অনুসরণ করা হয়) অগ্রাধিকারের সমস্যা তৈরি করে। p a/b**pকে a/(b**p)সংখ্যার মতো পার্স করতে হবে , তবে (a/b) * *pপি যদি একটি পয়েন্টার হয়, সুতরাং এটি পার্সারে সমাধান করতে হবে।

অন্য কথায়, এটি সম্ভব হত, তবে এটি অগ্রাধিকার টেবিল এবং বিশ্লেষককে জটিল করে তুলত এবং উভয়ই ইতিমধ্যে জটিল।

আমি জাভা সম্পর্কে গল্প জানি না; আমি যা করতে পারি তা অনুমান করা উচিত। সি হিসাবে, যেখানে এটি শুরু হয়েছিল, সমস্ত সি অপারেটরগুলি সহজেই অ্যাসেম্বলি কোডে অনুবাদ করা হয়, আংশিকভাবে সংযোজকটিকে সহজতর করার জন্য এবং আংশিকভাবে সহজ অপারেটরগুলিতে সময়সাপেক্ষ কার্যকারিতাটি আড়াল করা এড়াতে (যে সত্য operator+()এবং অন্যান্যরা দুর্দান্ত জটিলতা এবং পারফরম্যান্সের হিটগুলি লুকিয়ে রাখতে পারে তা হ'ল) সি ++) সম্পর্কে প্রাথমিক অভিযোগগুলির বিষয়ে।


2
চমৎকার উত্তর. আমার ধারণা, জাভা এই ক্ষেত্রে সি সরলীকরণের চেষ্টা করেছিল, তাই কেউ নতুন অপারেটর যুক্ত করতে চায় নি। এটি একটি দুঃখের বিষয় যা কেউ আমাকে জিজ্ঞাসা করেনি, আমি অবশ্যই পছন্দ করতাম *^। : ডি
মাআরটিইনস

1
সি পাঠ্য বিন্যাস করতে নির্মিত হয়েছিল। ফোর্টরান গণিত করার জন্য নির্মিত হয়েছিল এবং 20 বছর আগে জটিল, শক্তি এবং ম্যাট্রিক্স গণিত ছিল।
মার্টিন বেকেট

@ মার্টিন বেকেট: আপনি কি প্রমাণ খুঁজে পেতে পারেন যে পাঠ্য বিন্যাসের জন্য সি নির্মিত হয়েছিল? এটির জন্য এটি আমার কাছে খুব আনাড়ি ভাষা বলে মনে হয় এবং আমি সি এর উত্স সম্পর্কে যা পড়েছি তা মূলত ইউনিক্সের জন্য সিস্টেম প্রোগ্রামিংয়ের জন্য তৈরি করা হয়েছিল।
ডেভিড থর্নলি

@ ডেভিডথর্নলি - এটি ইউনিক্স-এ লেখার জন্য তৈরি করা হয়েছিল, তবে ইউনিক্সের প্রথম দিকের সমস্ত ব্যবহারগুলি পাঠ্য বিন্যাসে লেখা ছিল এবং এটি সময়ের জন্য এটির একটি বিস্তৃত স্ট্রিং এবং আই / ও লাইব্রেরি রয়েছে।
মার্টিন বেকেট

6
+1: এর জন্য বিদ্যমান অর্থ a**pহত্যাকারী। (হ্যাকস সেই সমস্যাটি ঘিরে কাজ করে… ব্রায়ার!)
ডোনাল ফেলো

13

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



3
আমি ব্যবহার করি x**2এবং x**3এটি খুব কমই না। এবং একটি ম্যাজিক পাউ বাস্তবায়ন যা সংকলকটি জানে এবং সহজ ক্ষেত্রেগুলির জন্য অনুকূল করে তোলে তা দুর্দান্ত।
কোডসইনচওস

2
@CodeInChaos: তবে x * xএবং x * x * xবর্গাকার এবং ঘনক্ষেত্র জন্য খারাপ পরিপূরক নয়।
ডেভিড থর্নলি

5
@ ডেভিড x*xএক্স এক্সপ্রেশন হলে আপনি কেবল লিখতে পারবেন না । সর্বোত্তম ক্ষেত্রে কোডটি অতিরঞ্জিত হয়ে যায়, এবং সবচেয়ে খারাপ ধীরে বা এমনকি ভুল। সুতরাং আপনার নিজের স্কোয়ার এবং কিউব ফাংশনগুলি সংজ্ঞায়িত করতে হবে। এবং তারপরেও পাওয়ার অপারেটর হিসাবে ** ব্যবহার করার চেয়ে কোডটি আরও খারাপ হবে।
কোডসইনচাওস

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

11

জাভা ভাষা এবং কোর গ্রন্থাগার ডিজাইনাররা গণিত শ্রেণিতে সর্বাধিক গণিত ক্রিয়াকলাপকে সরিয়ে দেওয়ার সিদ্ধান্ত নিয়েছে । দেখুন Math.pow ()

কেন? বিট-বিট-বিট নির্ভুলতার চেয়ে পারফরম্যান্সকে অগ্রাধিকার দেওয়ার নমনীয়তা। এটি অন্যান্য ভাষার বৈশিষ্ট্যের বিরুদ্ধে গিয়ে বলবে যে অন্তর্নির্মিত গণিত অপারেটরগুলির আচরণ প্ল্যাটফর্ম থেকে প্ল্যাটফর্মে আলাদা হতে পারে, অন্যদিকে ম্যাথ শ্রেণিটি নির্দিষ্টভাবে বলেছে যে আচরণটি সম্ভাব্যতার সাথে পারফরম্যান্সের জন্য নির্ভুলতা ত্যাগ করে, তাই ক্রেতা সাবধান:

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


6

সূত্রপাতটি প্রথম থেকেই ফোর্টরানের অংশ ছিল কারণ এটি বৈজ্ঞানিক প্রোগ্রামিংয়ে লক্ষ্যযুক্ত ছিল। প্রকৌশলী এবং পদার্থবিজ্ঞানীরা এটিকে প্রায়শই সিমুলেশনে ব্যবহার করেন কারণ পদার্থবিদ্যায় পাওয়ার আইনের সম্পর্কগুলি সাধারণ।

পাইথনের বৈজ্ঞানিক কম্পিউটিংয়েও শক্তিশালী উপস্থিতি রয়েছে (যেমন নুমপি এবং সায়পি)। এটি, এর ক্ষতিকারক অপারেটর সহ, এটিও বৈজ্ঞানিক প্রোগ্রামিংয়ের লক্ষ্য নিয়েছিল বলে পরামর্শ দেয়।

সি, জাভা এবং সি # এর সিস্টেম প্রোগ্রামিংয়ের মূল রয়েছে। সম্ভবত এটি এমন একটি প্রভাব যা সমর্থিত অপারেটরদের গোষ্ঠী থেকে বেরিয়ে গিয়েছিল।

শুধু একটি তত্ত্ব।


4

সি কেবলমাত্র সাধারণ গাণিতিক অপারেশনের জন্য সংজ্ঞায়িত অপারেটরগুলি ALU এর সাথে অ্যাক্সেসযোগ্য। এর মূল লক্ষ্যটি ছিল অ্যাসেম্বলি কোডে একটি মানব পাঠযোগ্য ইন্টারফেস তৈরি করা।

সি ++ কোনও অপারেটর আচরণ পরিবর্তন করে নি কারণ, এটি সিতে লিখিত সমস্ত কোড বেসটি উপযুক্ত হতে চেয়েছিল।

জাভা একই কাজ করেছিল কারণ এটি বিদ্যমান সি ++ প্রোগ্রামারদের ভয় দেখাতে চায় না।


যখন সি তৈরি করা হয়েছিল তখন গুণ এবং বিভাগের মধ্যে হার্ডওয়ারের অভাব খুব কমই ছিল না এবং সফ্টওয়্যারটিতে প্রয়োগ করতে হয়েছিল। তবুও সি এর গুণক এবং বিভাগ অপারেটর রয়েছে।
স্যারাইড

@ সিরাইড: আমার জানা মতে, ইউনিক্স চালানোর প্রথম কম্পিউটার পিডিপি -7 এর ইএইর মাধ্যমে হার্ডওয়্যার গুণ ও বিভাগ ছিল। দয়া করে দেখুন: বিটসভারস.আর.পিডিএফ
ডেক

1

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


@ আরটিএস - কোনও ল্যাঙ্গেজ বিকাশকারী কি কার্যক্ষমতার চেয়ে জ্ঞানের সন্ধান করছেন?

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

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

@ সিলিকোতে আমি এই অর্থটি বোঝাতে চাইনি যে এটি চূড়ান্ত মানটি গণনা করে, আমি বোঝাতে চাইছিলাম যে সংকলকগুলি ফাংশন কলটিকে অপ্টিমাইজ করবে, যাতে আপনার কেবল কাঁচা সমীকরণ থাকে।

2
@ জোসেফএক্স: অবশ্যই এটি একটি ভাল কারণ। এককটি *একটি লেজিকাল টোকেন, এটি নির্দেশনা বা গুণনের জন্য ব্যবহৃত হোক না কেন। একটি **অর্থ ক্ষতিকারক হয় এক বা দুটি লাক্ষিক টোকেন, এবং আপনি সত্যই চান না যে আপনার লেক্সারের প্রতীক টেবিলটি টোকেনাইজ করতে হবে।
ডেভিড থর্নলি

0

ঘটনাটি হল, পাটিগণিত অপারেটরগুলি কেবল ফাংশনের শর্টকাট। (প্রায়) আপনি তাদের সাথে যা কিছু করেন তা কোনও ফাংশন দিয়েই করা যেতে পারে। উদাহরণ:

c = a + b;
// equals
c.set(a.add(b));
// or as free functions
set(c, add(a,b));

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


-1

সংযোজন / বিয়োগ / অবহেলা এবং গুণ / বিভাগ মূল গাণিতিক অপারেটর। আপনি যদি বিদ্যুতকে অপারেটর তৈরি করেন তবে আপনি কোথায় থামবেন? স্কোয়ার রুট অপারেটর? এন-রুট অপারেটর? লোগারিদম অপারেটর?

আমি তাদের স্রষ্টাদের পক্ষে কথা বলতে পারি না, তবে আমি বলতে পারি যে আমি মনে করি এটি ভাষায় এই ধরনের অপারেটর রাখার পক্ষে অল্পস্বল্প হয়ে ওঠেননি th কীবোর্ডে থাকা অ্যালफा-সংখ্যা / সাদা-স্থানের অক্ষরের সংখ্যা বরং সীমাবদ্ধ rather যেমনটি হ'ল এটি আশ্চর্যের বিষয় যে সি ++ তে একটি মডুলাস অপারেটর রয়েছে।


+1 - modঅপারেটর হিসাবে থাকা কেন আজব তা আমি দেখতে পাচ্ছি না । এটি সাধারণত একটি একক নির্দেশনা। এটি পূর্ণসংখ্যার উপর প্রাথমিক অভিযান। এটি কম্পিউটার বিজ্ঞানের সর্বত্র ব্যবহৃত হয়। ( mod
বাউন্ডার্ড বাফারযুক্ত

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