কেন int x {y = 5} সম্ভব?


10
int main() {
    int y;
    int x{ y = 5 };
    //x is 5
}

এটি কীভাবে সম্ভব, যেহেতু y = 5 কোনও গণনাকারী প্রকাশ নয়?

এছাড়াও, কেন সংকলক বা আইডিই প্রধান () কোনও int না ফেরানোর বিষয়ে অভিযোগ করে না?


8
y = 5 এটি একটি অভিব্যক্তি, এবং এর মান রয়েছে 5। আপনি কেন মনে করেন না?
বেহুদা

2
নিখোঁজ returnহওয়ার mainজন্য এই প্রশ্নটি দেখুন
আখরোট

3
আরও ভাল, দ্বিতীয় প্রশ্নটি সরান। প্রতিটি প্রশ্নে একটি একক প্রশ্ন হ'ল স্ট্যাক ওভারফ্লোতে পছন্দসই মডেল।
স্টোরি টেলার - আনস্ল্যান্ডার মনিকা

y = 5এখানে আপনার কেন 5 টি ফলন হবে তা আপনার প্রশ্নের পুনঃনির্ধারণ করা উচিত । অ্যাসাইনমেন্ট অপারেটরদের কিছু ফিরিয়ে দেওয়ার সম্ভাবনা প্রকৃতপক্ষে C / C ++ এর একটি উদ্ভট বৈশিষ্ট্য।
ব্যবহারকারীর 7860670

উত্তর:


11

আমি আপনার শেষ প্রশ্ন থেকে শুরু করব

এছাড়াও, কেন সংকলক বা আইডিই প্রধান () কোনও int না ফেরানোর বিষয়ে অভিযোগ করে না?

সি ++ স্ট্যান্ডার্ড অনুযায়ী (6.6.1 মূল ফাংশন)

5 মূলত একটি রিটার্ন স্টেটমেন্টটি মূল ফাংশনটি ছেড়ে দেওয়ার (স্বয়ংক্রিয় স্টোরেজ সময়কাল সহ যে কোনও বস্তু ধ্বংস করে) এবং std :: প্রস্থানটিকে আর্গুমেন্ট হিসাবে রিটার্ন মান সহকারে ডেকে আনার প্রভাব ফেলে। যদি নিয়ন্ত্রণ যৌগিক-বিবৃতিটির শেষের প্রান্তে প্রবাহিত হয়, তবে প্রভাবটি অপারেন্ড 0 সহ একটি রিটার্নের সমান (এছাড়াও 18.3 দেখুন)।

এবং এই প্রশ্নের সাথে আপেক্ষিক

এটি কীভাবে সম্ভব, যেহেতু y = 5 কোনও গণনাকারী প্রকাশ নয়?

সি ++ স্ট্যান্ডার্ড থেকে (8.18 অ্যাসাইনমেন্ট এবং যৌগিক অ্যাসাইনমেন্ট অপারেটর)

1 অ্যাসাইনমেন্ট অপারেটর (=) এবং যৌগিক নিয়োগ অপারেটরগুলি সমস্ত গ্রুপকে ডান থেকে বামে। সবার জন্য তাদের বাম অপারেন্ড হিসাবে একটি পরিবর্তনযোগ্য লভ্যালু প্রয়োজন এবং বাম অপারেন্ডকে উল্লেখ করে একটি লভালিউটি ফিরিয়ে দিন।

এই ঘোষণা স্প

int x{ y = 5 };

সমানভাবে দুটি বিবৃতি বিভক্ত করা যেতে পারে

y = 5;
int x{ y };

এছাড়াও সি ++ এর মধ্যে আপনি নিম্নলিখিত ভেরিয়েবলের জন্য একটি রেফারেন্স তৈরি করতে পারেন

int &x{ y = 5 };

এখানে একটি বিক্ষোভমূলক প্রোগ্রাম

#include <iostream>

int main() 
{
    int y;
    int &x{ y = 5 };    

    std::cout << "y = " << y << '\n';

    x = 10;

    std::cout << "y = " << y << '\n';
}

এর আউটপুট হয়

y = 5
y = 10

আপনি এই ঘোষণা করতে পারেন

int x{ y = 5 };

আবারও লিখুন

int x = { y = 5 };

তবে এটিকে (উপরোক্ত ঘোষণার মতো দেখতে একইভাবে) দুটি ঘোষণার মধ্যে পার্থক্য রয়েছে তা বিবেচনা করুন।

auto x{ y = 5 };

এবং

auto x = { y = 5 };

প্রথম ঘোষণায় ভেরিয়েবলের xটাইপ থাকে int। দ্বিতীয় ঘোষণায় ভেরিয়েবলের xপ্রকার রয়েছে std::initializer_list<int>

পার্থক্যটিকে আরও দৃশ্যমান করার জন্য দেখুন কীভাবে বস্তুর মানগুলি আউটপুট হয়।

#include <iostream>

int main() 
{
    int y;
    auto x1 { y = 5 };  

    std::cout << "x1 = " << x1 << '\n';

    auto x2 = { y = 10 };   

    std::cout << "*x2.begin()= " << *x2.begin() << '\n';

    std::cout << "y = " << y << '\n';

    return 0;
}

প্রোগ্রাম আউটপুট হয়

x1 = 5
*x2.begin()= 10
y = 10

16

এটি কীভাবে সম্ভব, যেহেতু y = 5 কোনও গণনাকারী প্রকাশ নয়?

এটি একটি অ্যাসাইনমেন্ট এবং অ্যাসাইনমেন্টগুলির ফলস্বরূপ মানগুলি, যেমন "বাম অপারেন্ডের সিভি- অযোগ্যদের ধরণ", দেখুন [এক্সপ্রেস / 3] । সুতরাং y = 5ফলস্বরূপ y, যা হয় 5, যা আরম্ভ করার জন্য ব্যবহৃত হয় x

আপনার দ্বিতীয় প্রশ্নের সম্মানের সাথে, প্রধান (বা [বেসিক.স্টার্ট.মাইন / 5] ) এর প্রতি সম্মান দেখুন :

মূল ফাংশনের শরীরে returnস্টেটমেন্টটি ধারণ করার দরকার নেই : যদি কোনও বিবৃতি না মিলিয়ে নিয়ন্ত্রণের শেষের দিকে পৌঁছে যায় returnতবে প্রভাবটি কার্যকর হয় return 0;

অতএব, সংকলক বা আইডিই আপনাকে returnশেষের দিকে একটি অনুপস্থিত বিবৃতি সম্পর্কে সতর্ক করে mainদেবে তা সম্পূর্ণ ভুল হবে। স্বীকারযোগ্যভাবে , আপনার সর্বদা returnঅ- voidকার্যকারিতা নির্বাহকারীmain থেকে অবজেক্ট করা উচিত এই ধরণের ... ভাল, historical তিহাসিক কারণে আমার ধারণা।


2
একটি অভিব্যক্তি করতে ফলস্বরূপ একটি মান, কিন্তু শুধুমাত্র একটি ফাংশন যা করতে পারেন returnনা। -pedantic
বেহুদা

আমি মনে করি এটি x {y = 5}; সি
ভুরা

@ ভূরা - প্রশ্নটি সি ++ সম্পর্কে নয়, সি
স্টোরি টেলার - আনস্ল্যান্ডার মনিকা

সম্ভবত এটি উল্লেখ করার মতো, প্রয়োজন না হলেও, এখনও মূল থেকে কোনও মান ফেরত দেওয়া ভাল অভ্যাস হিসাবে বিবেচিত হয়?
অ্যাকোনকাগুয়া

4

operator=()একটি মান, যা পরিবর্তনশীল নির্ধারিত মান মধ্যে ফলাফল নেই। এর কারণে, এই জাতীয় কার্য সম্পাদন করা সম্ভব:

int x, y, z;
x = y = z = 1;

নিয়োগ অভিব্যক্তি টি মান । ফাংশনগুলির রিটার্ন মান রয়েছে; এক্সপ্রেশন না।
পিট বেকার

3

আপনি যদি সিপ্রেফারেন্সির ডকুমেন্টেশনগুলি একবার দেখুন , আপনি দেখতে পাবেন যে operator=()বরাদ্দ করা বস্তুটির একটি রেফারেন্স ফিরে আসে। সুতরাং, একটি অ্যাসাইনমেন্ট একটি এক্সপ্রেশন হিসাবে ব্যবহার করা যেতে পারে যা বরাদ্দ করা বস্তুটি ফেরত দেয়।

তারপরে, এটি ধনুর্বন্ধনী সহ একটি সাধারণ কাজ ment

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