অ্যাসাইনমেন্ট স্টেটমেন্টগুলি কেন একটি মূল্য ফেরত দেয়?


126

এটি অনুমোদিত:

int a, b, c;
a = b = c = 16;

string s = null;
while ((s = "Hello") != null) ;

আমার বোঝার জন্য, অ্যাসাইনমেন্ট s = ”Hello”;কেবলমাত্র “Hello”বরাদ্দ করা sউচিত, তবে ক্রিয়াকলাপটি কোনও মান ফিরিয়ে দেবে না। যদি এটি সত্য হয়, তবে ((s = "Hello") != null)কোনও ত্রুটি nullঘটবে , যেহেতু কোনও কিছুর সাথে তুলনা করা হবে।

অ্যাসাইনমেন্ট স্টেটমেন্টগুলিকে কোনও মান ফেরত দেওয়ার অনুমতি দেওয়ার পিছনে যুক্তি কী?


44
রেফারেন্সের জন্য, এই আচরণটি সি # স্পেসে সংজ্ঞায়িত করা হয়েছে : "একটি সাধারণ অ্যাসাইনমেন্ট এক্সপ্রেশনের ফলাফলটি বাম অপারেন্ডকে নির্ধারিত মান The ফলাফলটি বাম অপারেণ্ডের মতো একই ধরণের এবং সর্বদা মান হিসাবে শ্রেণিবদ্ধ হয়।"
মাইকেল পেট্রোটা

1
@ স্কুরমেডেল আমি ডাউনওয়োটার নই, আমি আপনার সাথে একমত। তবে সম্ভবত এটি একটি অলৌকিক প্রশ্ন বলে মনে হয়েছিল?
jsmith

পাস্কেল / ডেলফি অ্যাসাইনমেন্টে: = কিছুই দেয় না। আমি এটা ঘৃণা করি.
অ্যান্ড্রে

20
সি শাখায় ভাষার জন্য মানক। অ্যাসাইনমেন্টগুলি এক্সপ্রেশন।
হ্যানস প্যাস্যান্ট

"অ্যাসাইনমেন্ট ... কেবলমাত্র" হ্যালো "এর জন্য নির্ধারিত হওয়া উচিত, তবে ক্রিয়াকলাপটির কোনও মান ফেরত দেওয়া উচিত নয়" - কেন? "অ্যাসাইনমেন্ট স্টেটমেন্টগুলিকে কোনও মান ফেরত দেওয়ার অনুমতি দেওয়ার পিছনে যুক্তি কী?" - কারণ এটি কার্যকর, যেমন আপনার নিজস্ব উদাহরণগুলি প্রমাণ করে। (আচ্ছা, আপনার দ্বিতীয় উদাহরণটি বোকা, তবে while ((s = GetWord()) != null) Process(s);তা নয়)।
জিম বাল্টার 21

উত্তর:


160

আমার বোঝার জন্য, অ্যাসাইনমেন্ট s = "হ্যালো"; কেবলমাত্র "হ্যালো" এর জন্য নির্ধারিত হওয়া উচিত, তবে ক্রিয়াকলাপটির কোনও মান ফেরত দেওয়া উচিত নয়।

আপনার বোঝার 100% ভুল। আপনি কেন এই মিথ্যা জিনিস বিশ্বাস করেন তা ব্যাখ্যা করতে পারেন?

অ্যাসাইনমেন্ট স্টেটমেন্টগুলিকে কোনও মান ফেরত দেওয়ার অনুমতি দেওয়ার পিছনে যুক্তি কী?

প্রথমে, অ্যাসাইনমেন্ট স্টেটমেন্টগুলি কোনও মান দেয় না। অ্যাসাইনমেন্ট এক্সপ্রেশন একটি মান উত্পাদন করে। একটি অ্যাসাইনমেন্ট এক্সপ্রেশন একটি আইনী বিবৃতি; সি # তে আইনী বক্তব্য রয়েছে যা কেবলমাত্র কয়েকটি মুখ্য প্রকাশ আছে: একটি বিবৃতি প্রত্যাশিত যেখানে অভিব্যক্তি, উদাহরণস্বরূপ নির্মাণ, বৃদ্ধি, হ্রাস, অনুরোধ এবং কার্যনির্বাহী এক্সপ্রেশন ব্যবহার করা যেতে পারে।

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

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

এই বৈশিষ্ট্যটিকে অনুমতি দেওয়ার পিছনে যুক্তি কারণ (1) এটি প্রায়শই সুবিধাজনক এবং (২) এটি সি-জাতীয় ভাষায় মূর্তিমান।

যে কেউ প্রশ্ন করতে পারে যে অনুরোধ করা যেতে পারে: সি এর মতো ভাষায় এই মূর্খতাটি কেন?

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


1
অবগত ছিল না যে কোনও কিছু যা কোনও মান দেয় (এমনকি উদাহরণস্বরূপ নির্মাণকে একটি অভিব্যক্তি হিসাবে বিবেচনা করা হয়)
user437291

9
@ ব্যবহারকারী 437291: যদি উদাহরণস্বরূপ নির্মাণ কোনও অভিব্যক্তি না হয় তবে আপনি নির্মিত বস্তুর সাথে কিছুই করতে পারবেন না - আপনি এটি কোনও কিছুতে নির্ধারণ করতে পারবেন না, আপনি এটি কোনও পদ্ধতিতে পাস করতে পারবেন না, এবং কোনও পদ্ধতিতে কল করতে পারবেন না চালু কর. বেশ বেহুদা হবে, তাই না?
টিমভি

1
ভেরিয়েবল পরিবর্তন করা আসলে অ্যাসাইনমেন্ট অপারেটরের একটি "পার্শ্ব প্রতিক্রিয়া" যা অভিব্যক্তি তৈরি করে এটির প্রাথমিক উদ্দেশ্য হিসাবে একটি মান দেয়।
এম কে 12

2
"আপনার বোঝার 100% ভুল is" - যদিও ওপির ইংরেজী ব্যবহার সবচেয়ে বেশি নয় তবে তার "বোঝাপড়া" কী হওয়া উচিত তা সম্পর্কে এটি একটি মতামত তৈরি করে, সুতরাং এটি "100% ভুল" হতে পারে এমন ধরণের জিনিস নয় । কিছু ভাষা ডিজাইনার ওপি'র "উচিত" এর সাথে একমত হন এবং অ্যাসাইনমেন্টগুলির কোনও মূল্য নেই বা অন্যথায় তাদেরকে এক্সপ্রেসেশন হতে নিষেধ করে। আমি মনে করি এটি =/ ==টাইপোর একটি অত্যধিক প্রতিক্রিয়া , যা সহজেই এর মানটি বন্ধন না করে মান ব্যবহার না করেই সম্বোধন করা হয় =। যেমন, if ((x = y))বা if ((x = y) == true)অনুমোদিত তবে if (x = y)তা নয়।
জিম বাল্টার 21

"অবহিত ছিল না যে কোনও মান যা প্রত্যাবর্তন করে ... তাকে একটি অভিব্যক্তি হিসাবে বিবেচনা করা হয়" - হুম ... যে কোনও মান প্রত্যাবর্তন করে তাকেই একটি অভিব্যক্তি হিসাবে বিবেচনা করা হয় - দু'টি কার্যত সমার্থক।
জিম বাল্টার

44

আপনি উত্তর প্রদান করেন নি? এটি আপনি উল্লেখ করেছেন ঠিক তেমন ধরনের কনস্ট্রাক্টস সক্ষম করতে।

একটি সাধারণ ক্ষেত্রে যেখানে অ্যাসাইনমেন্ট অপারেটরের এই সম্পত্তি ব্যবহৃত হয় তা হ'ল কোনও ফাইলের লাইনগুলি পড়া ...

string line;
while ((line = streamReader.ReadLine()) != null)
    // ...

1
+1 এটি এই নির্মাণের সবচেয়ে ব্যবহারিক ব্যবহারগুলির মধ্যে একটি হতে হবে
মাইক বার্টন

11
আমি সত্যিই সাধারণ সম্পত্তি প্রারম্ভিকদের জন্য এটি সত্যিই পছন্দ করি তবে আপনাকে অবশ্যই সাবধানতা অবলম্বন করতে হবে এবং পঠনযোগ্যতার জন্য "সরল" নিম্নের জন্য আপনার লাইনটি আঁকতে হবে: return _myBackingField ?? (_myBackingField = CalculateBackingField());নাল পরীক্ষা করার জন্য এবং নিয়োগের চেয়ে অনেক কম খড়ক।
টম মেফিল্ড

34

অ্যাসাইনমেন্ট এক্সপ্রেশনগুলির আমার প্রিয় ব্যবহারটি অলসভাবে প্রাথমিক বৈশিষ্ট্যের জন্য।

private string _name;
public string Name
{
    get { return _name ?? (_name = ExpensiveNameGeneratorMethod()); }
}

5
এ কারণেই এত লোক ??=সিনট্যাক্সের পরামর্শ দিয়েছেন ।
কনফিগারকারী

27

একটির জন্য, এটি আপনাকে আপনার অ্যাসাইনমেন্টগুলি শৃঙ্খলিত করার অনুমতি দেয়, যেমন আপনার উদাহরণ হিসাবে:

a = b = c = 16;

অন্যটির জন্য, এটি আপনাকে একক অভিব্যক্তিতে ফলাফল নির্ধারণ ও পরীক্ষা করতে দেয়:

while ((s = foo.getSomeString()) != null) { /* ... */ }

উভয়ই সম্ভবত সন্দেহজনক কারণ, তবে অবশ্যই এমন লোক রয়েছে যারা এই নির্মাণগুলি পছন্দ করেন।


5
+1 চেইনিং একটি সমালোচনা বৈশিষ্ট্য নয় তবে এতগুলি জিনিস যখন না করে তখন এটি "কেবলমাত্র কাজ করে" দেখে ভাল লাগে।
মাইক বার্টন

শৃঙ্খলার জন্যও +1; আমি সর্বদা এটিকে একটি বিশেষ কেস হিসাবে ভাবতাম যা "এক্সপ্রেশনগুলি ফেরতের মানগুলি" এর প্রাকৃতিক পার্শ্ব প্রতিক্রিয়ার চেয়ে ভাষা দ্বারা পরিচালিত হয়েছিল।
কালেব বেল

2
এটি আপনাকে রিটার্নে অ্যাসাইনমেন্ট ব্যবহার করতে দেয়:return (HttpContext.Current.Items["x"] = myvar);
সার্জ শাল্টজ

14

আপনার এই বৈশিষ্ট্যটির প্রয়োজনীয় বিবৃতিটি সঠিকভাবে ব্যবহার করতে ইতিমধ্যে উল্লিখিত কারণগুলি (অ্যাসাইনমেন্ট চেইনিং, লুপগুলির মধ্যে সেট-এবং-টেস্ট ইত্যাদি) বাদ দিন using:

using (Font font3 = new Font("Arial", 10.0f))
{
    // Use font3.
}

এমএসডিএন ডিসপোজেবল অবজেক্টটি ব্যাবহারকারী স্টেটমেন্টের বাইরে ঘোষণা করতে নিরুৎসাহিত করে, কারণ এটি নিষ্পত্তি হওয়ার পরেও তা স্কোপেই থাকবে (আমার সাথে যুক্ত হওয়া এমএসডিএন নিবন্ধটি দেখুন)।


4
আমি মনে করি না এটি সত্যিই নির্ধারিতভাবে এসাইনমেন্ট শৃঙ্খলাবদ্ধ।
কেনে

1
@ কেনি: আহ ... না, তবে আমি কখনও দাবি করিনি যে এটিও ছিল। যেমন আমি বলেছি, ইতিমধ্যে উল্লিখিত কারণগুলি বাদ দিয়ে - যার মধ্যে অ্যাসাইনমেন্ট শৃঙ্খলা অন্তর্ভুক্ত রয়েছে - ব্যবহারের বিবৃতিটি ব্যবহার করা আরও অনেক কঠিন হবে যদি অ্যাসাইনমেন্ট অপারেটরের কার্যকারিতার ফলাফলটি ফেরত দেয় তা সত্য নয়। এটি আসলেই অ্যাসাইনমেন্ট শৃঙ্খলার সাথে সম্পর্কিত নয়।
মার্টিন টার্নওয়াল

1
তবে এরিক যেমন উপরে উল্লিখিত হয়েছে, "অ্যাসাইনমেন্ট স্টেটমেন্টগুলি কোনও মান দেয় না"। এটি আসলে ইউজিং স্টেটমেন্টের কেবল ভাষার বাক্য গঠন, এটির প্রমাণ হ'ল যে কোনও একটি ব্যবহারের বিবৃতিতে "অ্যাসাইনমেন্ট এক্সপ্রেশন" ব্যবহার করতে পারে না।
কেনে

@ কেনি: দুঃখিত, আমার পরিভাষাটি পরিষ্কারভাবে ভুল ছিল। আমি বুঝতে পারি যে ব্যবহারের বিবৃতিটি কোনও মূল্য ফেরত দেওয়ার জন্য অ্যাসাইনমেন্ট এক্সপ্রেশনগুলির ভাষায় সাধারণ সমর্থন না থাকলে প্রয়োগ করা যেতে পারে। যদিও এটি আমার দৃষ্টিতে ভয়াবহভাবে বেমানান হবে।
মার্টিন টার্নওয়াল

2
@ কেনি: আসলে, কেউ একটি সংজ্ঞা-ও-নিয়োগ বিবৃতি, বা কোনও অভিব্যক্তি ব্যবহার করতে পারে using। এই সমস্ত আইনগত আছেন: using (X x = new X()), using (x = new X()), using (x)। তবে, এই উদাহরণে, ব্যবহারের বিবৃতিটির বিষয়বস্তুগুলি একটি বিশেষ সিনট্যাক্স যা কোনও মূল্য ফেরত দেওয়ার ক্ষেত্রে কোনও ক্ষেত্রে নির্ভর করে না - Font font3 = new Font("Arial", 10.0f)এটি কোনও অভিব্যক্তি নয় এবং কোনও জায়গায় অভিব্যক্তি প্রত্যাশা করে এমনটি বৈধ নয়।
কনফিগারকারী

10

আমি তার উত্তরে এরিক লিপার্টের নির্দিষ্ট পয়েন্টটি বিস্তারিতভাবে বর্ণনা করতে চাই এবং একটি নির্দিষ্ট অনুষ্ঠানে স্পটলাইট স্থাপন করতে চাই যা অন্য কারও দ্বারা ছোঁয়া হয়নি। এরিক বলেছেন:

[...] একটি অ্যাসাইনমেন্ট প্রায় সবসময় সেই মানের পিছনে ফেলে যায় যা কেবলমাত্র একটি রেজিস্টারে নির্ধারিত হয়েছিল।

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

এই থ্রেডের উত্তরে এখনও পর্যন্ত নির্মিত সমস্ত উদাহরণের জন্য 'দক্ষ' হ্যাঁ। কিন্তু গেট- এবং সেট অ্যাক্সেসর ব্যবহার করে এমন বৈশিষ্ট্য এবং সূচকগুলির ক্ষেত্রে দক্ষ? একেবারেই না. এই কোডটি বিবেচনা করুন:

class Test
{
    public bool MyProperty { get { return true; } set { ; } }
}

এখানে আমাদের একটি সম্পত্তি আছে, যা একটি ব্যক্তিগত ভেরিয়েবলের জন্য একটি মোড়ক এমনকি নয়। যখনই আহ্বান করা হয়েছে সে সত্য প্রত্যাবর্তন করবে, যখনই কেউ তার মূল্য নির্ধারণ করার চেষ্টা করে সে কিছুই করবে না। সুতরাং এই সম্পত্তি যখনই মূল্যায়ন করা হয়, তিনি সত্যবাদী হতে হবে। এর কি দেখতে দিন:

Test test = new Test();

if ((test.MyProperty = false) == true)
    Console.WriteLine("Please print this text.");

else
    Console.WriteLine("Unexpected!!");

অনুমান করুন এটি কি প্রিন্ট করে? এটি মুদ্রণ Unexpected!!। এটি সক্রিয় হিসাবে, সেট অ্যাক্সেসর প্রকৃতপক্ষে বলা হয়, যা কিছুই করে না। তবে তারপরে, গেট অ্যাকসেসরটিকে কখনই ডাকা হয় না। অ্যাসাইনমেন্টটি কেবল falseআমাদের সম্পত্তিতে নির্ধারিত মানটির পিছনে চলে যায় । এবং এই falseমানটি যদি স্টেটমেন্টটি মূল্যায়ন করে।

আমি একটি বাস্তব বিশ্বের উদাহরণ দিয়ে শেষ করব যা আমাকে এই সমস্যাটি নিয়ে গবেষণা করতে পেরেছে। আমি এমন একটি সূচক তৈরি করেছি যা সংগ্রহের জন্য একটি সুবিধাজনক মোড়ক ( List<string>) যা আমার এক শ্রেণীর ব্যক্তিগত ভেরিয়েবল হিসাবে ছিল।

সূচককে পাঠানো প্যারামিটারটি একটি স্ট্রিং ছিল, যা আমার সংগ্রহে মান হিসাবে বিবেচিত হবে। গিগ অ্যাক্সেসরটি যদি সেই তালিকা তালিকায় উপস্থিত থাকে বা না থাকে তবে সত্য বা মিথ্যা ফিরে আসবে। সুতরাং গেট অ্যাকসেসরটি List<T>.Containsপদ্ধতিটি ব্যবহার করার অন্য উপায় ছিল ।

যদি সূচকের সেট অ্যাকসেসরটিকে একটি যুক্তি হিসাবে একটি স্ট্রিং সহ ডাকা হয় এবং ডান অপরেন্ডটি একটি বুল হয় trueতবে তিনি সেই পরামিতিটি তালিকায় যুক্ত করবেন। তবে যদি একই প্যারামিটারটি অ্যাক্সেসরে প্রেরণ করা হয় এবং ডান অপরেন্ডটি একটি বুল হয় তবে falseতিনি পরিবর্তে উপাদানটি তালিকা থেকে মুছবেন। সুতরাং সেট অ্যাক্সেসর উভয় List<T>.Addএবং একটি সুবিধাজনক বিকল্প হিসাবে ব্যবহৃত হয়েছিল List<T>.Remove

আমি ভেবেছিলাম আমার কাছে একটি গেইটওয়ে হিসাবে প্রয়োগ করা নিজস্ব যুক্তি দিয়ে তালিকাটি মোড়ানো একটি ঝরঝরে এবং কমপ্যাক্ট "এপিআই" আছে। একা এক সূচকের সাহায্যে আমি কয়েকটি সেট কীস্ট্রোক দিয়ে অনেক কিছুই করতে পারি। উদাহরণস্বরূপ, আমি কীভাবে আমার তালিকায় একটি মান যুক্ত করার চেষ্টা করতে পারি এবং এটি সেখানে রয়েছে তা যাচাই করতে পারি? আমি ভেবেছিলাম এটি প্রয়োজনীয় কোডের একমাত্র লাইন:

if (myObject["stringValue"] = true)
    ; // Set operation succeeded..!

তবে আমার আগের উদাহরণটি যেমন দেখিয়েছে, সেই গেট অ্যাকসেসর যা দেখে মনে করা হয় যে তালিকার মানটি সত্যিই আছে কিনা তাও কল করা হয়নি। trueমান সবসময় পিছনে কার্যকরভাবে অন্তক যাই হোক না কেন যুক্তিবিজ্ঞান আমি আমার পেতে অ্যাকসেসর বাস্তবায়িত করেছিলেন রাখা হয়।


খুব আকর্ষণীয় উত্তর। এবং এটি আমাকে পরীক্ষা-চালিত বিকাশের বিষয়ে ইতিবাচকভাবে ভাবতে বাধ্য করেছে।
এলিয়ট

1
যদিও এটি আকর্ষণীয়, তবে এটি এরিকের উত্তর সম্পর্কে মন্তব্য, অপের প্রশ্নের কোনও উত্তর নয় answer
জিম বাল্টার

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

6

যদি অ্যাসাইনমেন্টটি কোনও মান ফেরত a = b = c = 16দেয় না তবে লাইনটি কাজ করবে না।

এছাড়াও এই জাতীয় জিনিস লিখতে সক্ষম while ((s = readLine()) != null)হতে কখনও কখনও দরকারী হতে পারে।

সুতরাং অ্যাসাইনমেন্টটি নির্ধারিত মানটি ফেরত দেওয়ার পিছনে কারণ হ'ল আপনাকে সেই জিনিসগুলি করতে দেওয়া।


কারও উল্লিখিত অসুবিধাগুলি - আমি এখানে ভেবে ভেবে এসেছি যে অ্যাসাইনমেন্টগুলি কেন বাতিল হতে পারে না, যাতে সাধারণ অ্যাসাইনমেন্ট বনাম তুলনা বাগ 'যদি (কিছু = 1) always}' সর্বদা সত্য ফিরে আসার পরিবর্তে সংকলন করতে ব্যর্থ হয়। আমি এখন দেখছি যে এটি তৈরি করবে ... অন্যান্য সমস্যা!
জন

1
@ জোন যে বাগটি বন্ধুত্বপূর্ণ নয় এমন =অভিব্যক্তিটি ঘটানোর বিষয়ে অস্বীকৃতি বা সতর্কতা দিয়ে সহজেই প্রতিরোধ করা যেতে পারে (যদি / যখন বিবৃতি নিজেই প্যারেনগুলি গণনা না করে)। জিসিসি এই ধরনের সতর্কতা দেয় এবং এর মাধ্যমে সংকলিত সি / সি ++ প্রোগ্রামগুলি থেকে এই শ্রেণীর বাগগুলি মূলত সরিয়ে দেয়। এটি একটি লজ্জার বিষয় যে অন্যান্য সংকলক লেখকরা এটিতে এবং সিসিতে বেশ কয়েকটি অন্যান্য ভাল ধারণার প্রতি খুব কম মনোযোগ দিয়েছেন।
জিম বাল্টার 21

4

আমি মনে করি আপনি কীভাবে পার্সার সেই সিনট্যাক্সটি ব্যাখ্যা করতে যাচ্ছেন তা ভুল বুঝছেন। অ্যাসাইনমেন্টটি প্রথমে মূল্যায়ন করা হবে , এবং তারপরে ফলাফলটি NUL এর সাথে তুলনা করা হবে, অর্থাত্ বিবৃতিটি সমান:

s = "Hello"; //s now contains the value "Hello"
(s != null) //returns true.

অন্যরা যেমন উল্লেখ করেছে, একটি কার্যভারের ফলাফল হ'ল নির্ধারিত মান। আমি সুবিধা পেয়েছি তা কল্পনা করা কঠিন মনে হয়

((s = "Hello") != null)

এবং

s = "Hello";
s != null;

সমতুল্য না ...


আপনি যখন ব্যবহারিক দিক থেকে সঠিক হন তখন আপনার দুটি লাইন আপনার বক্তব্যের সমতুল্য যে অ্যাসাইনমেন্টটি কোনও মূল্য ফেরত দিচ্ছে না তা প্রযুক্তিগতভাবে সত্য নয়। আমার বোধগম্যতা হল যে কোনও অ্যাসাইনমেন্টের ফলাফলটি একটি মান (সি # স্পেস অনুযায়ী), এবং সেই দিক থেকে সংযোজন অপারেটরটি 1 + 2 + 3
স্টিভ এলিঞ্জার

3

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


2

দুটি কারণেই আপনি নিজের পোস্টে অন্তর্ভুক্ত করেছেন
) 1) যাতে আপনি a = b = c = 16
2 টি করতে পারেন) সুতরাং আপনি যদি কোনও নিয়োগ সফল হয় তবে পরীক্ষা করতে পারেন if ((s = openSomeHandle()) != null)


1

'A ++' বা 'প্রিন্টফ ("foo") "স্ব-নিহিত বিবৃতি হিসাবে বা বৃহত্তর অভিব্যক্তির অংশ হিসাবে কার্যকর হতে পারে তার অর্থ সি এর পক্ষে সম্ভাব্যতার জন্য অনুমতি দেওয়া উচিত যে এক্সপ্রেশন ফলাফলগুলি হতে পারে বা নাও পারে ব্যবহার করা হয়েছে। প্রদত্ত যে, একটি সাধারণ ধারণা আছে যে অভিব্যক্তিগুলি কার্যকরভাবে কোনও মূল্য 'প্রত্যাবর্তন' করতে পারে এবং তা করতে পারে। অ্যাসাইনমেন্ট শৃঙ্খলা সিতে কিছুটা "আকর্ষণীয়" হতে পারে, এবং সি ++ এর মধ্যে আরও আকর্ষণীয় হতে পারে, যদি প্রশ্নে সমস্ত ভেরিয়েবলগুলি একই ধরণের না থাকে। এই ধরনের ব্যবহারগুলি সম্ভবত সেরা এড়ানো যায়।


1

আর একটি দুর্দান্ত উদাহরণ ব্যবহারের ক্ষেত্রে, আমি এটি সর্বদা ব্যবহার করি:

var x = _myVariable ?? (_myVariable = GetVariable());
//for example: when used inside a loop, "GetVariable" will be called only once

0

আমি এখানে উত্তরগুলিতে দেওয়া দেখতে পাচ্ছি না এমন একটি অতিরিক্ত সুবিধা হ'ল অ্যাসাইনমেন্টের বাক্য গঠনটি গাণিতিকের উপর ভিত্তি করে।

এখন x = y = b = c = 2 + 3গাণিতিকগুলিতে সি-স্টাইলের ভাষার চেয়ে আলাদা কিছু অর্থ; গাণিতিক ক্ষেত্রে এটির একটি দৃser় বক্তব্য, আমরা বলেছি যে x y এর সমান এবং সি-স্টাইলের ভাষায় এটি এমন একটি নির্দেশ যা এক্স কার্যকর করার পরে x এর সমান করে তোলে etc.

এটি বলেছিল, পাটিগণিত এবং কোডের মধ্যে এখনও যথেষ্ট সম্পর্ক রয়েছে যে কোনও উপযুক্ত কারণ না থাকলে পাটিগণিতের মধ্যে প্রাকৃতিক কী তা অস্বীকার করা বোধগম্য নয়। (সি-স্টাইলের ভাষাগুলি সমান চিহ্নের ব্যবহার থেকে অন্য যে জিনিসটি নিয়েছিল তা হল সমতা তুলনার জন্য == ব্যবহার though যদিও যদিও ডান-সর্বাধিক == এই ধরণের শৃঙ্খলা অসম্ভব বলে মান দেয়))


@ জিমবাল্টার আমি ভাবছি যে পাঁচ বছরের মধ্যে, আপনি আসলে এর বিরুদ্ধে তর্ক করতে পারেন কিনা।
জন হান্না 21

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

... অনিবার্য কারণ কারণ সেই ভাষাটি =সমতা তুলনার জন্যও ব্যবহৃত হয়েছিল, সুতরাং এর অর্থ সি-স্টাইলের ভাষাগুলির a = b = cঅর্থ কী a = b == c। আমি সিটিতে শৃঙ্খলাবদ্ধতাটিকে অনেক বেশি স্বজ্ঞাত বলে মনে করেছি কারণ আমি পাটিগণিতের সাথে সাদৃশ্য আনতে পারি।
জন হান্না

0

আমার যখন একগুচ্ছ স্টাফ আপডেট করতে হবে এবং কোনও পরিবর্তন হয়েছে কি না তা ফিরে আসার দরকার পরে আমি অ্যাসাইনমেন্ট রিটার্ন মানটি ব্যবহার করতে চাই:

bool hasChanged = false;

hasChanged |= thing.Property != (thing.Property = "Value");
hasChanged |= thing.AnotherProperty != (thing.AnotherProperty = 42);
hasChanged |= thing.OneMore != (thing.OneMore = "They get it");

return hasChanged;

যদিও সাবধান। আপনি মনে করতে পারেন আপনি এটি এটি সংক্ষিপ্ত করতে পারেন:

return thing.Property != (thing.Property = "Value") ||
    thing.AnotherProperty != (thing.AnotherProperty = 42) ||
    thing.OneMore != (thing.OneMore = "They get it");

তবে এটি প্রথমে সত্যটি খুঁজে পাওয়ার পরে বা বিবৃতিগুলির মূল্যায়ন করা বন্ধ করবে। এই ক্ষেত্রে এর অর্থ এটি পৃথক প্রথম মান নির্ধারণের পরে পরবর্তী মানগুলি নির্ধারণ করা বন্ধ করে দেয়।

এটির সাথে চারপাশে খেলতে https://dotnetfiddle.net/e05Rh8 দেখুন

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