স্ট্রাস্ট্রাপের উদাহরণে, "রিটার্ন 1: 2" এর মধ্যে কোলনটির অর্থ কী?


163

আমি কোলনের একটি নির্দিষ্ট ব্যবহার বুঝতে পারি না।

আমি এটি বার্জন স্ট্রোস্ট্রুপের সি সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ , চতুর্থ সংস্করণ, বিভাগ 11.4.4 "কল এবং রিটার্ন" বইয়ের 297 পৃষ্ঠাতে পেয়েছি:

void g(double y)
{
  [&]{ f(y); }                                               // return type is void
  auto z1 = [=](int x){ return x+y; }                        // return type is double
  auto z2 = [=,y]{ if (y) return 1; else return 2; }         // error: body too complicated
                                                             // for return type deduction
  auto z3 =[y]() { return 1 : 2; }                           // return type is int
  auto z4 = [=,y]()−>int { if (y) return 1; else return 2; } // OK: explicit return type
}

বিবৃতিতে বিভ্রান্তিকর কোলনটি 7 তম লাইনে উপস্থিত হয় return 1 : 2। এটি কী হতে পারে আমার কোনও ধারণা নেই। এটি কোনও লেবেল বা টার্নারি অপারেটর নয়।

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


6
এটি আমার শেষের একটি সংকলন ত্রুটি (জিসিসি এবং ঝনঝন)। প্লাস all সমস্ত লাইনের জন্য সেমিকোলন প্রয়োজন, তবে এখনও একটি ত্রুটি।
ক্রুজ জিন

216
মডারেটর দ্রষ্টব্য: দয়া করে এটি একটি "টাইপো" প্রশ্ন হিসাবে বন্ধ করার জন্য ভোট দেওয়ার আগে খুব সাবধানতার সাথে চিন্তা করুন। হ্যাঁ, সমস্যাটি টাইপোর, তবে এটি কোনও টাইপো নয় যা প্রশ্নকারীরা করেছেন। বরং এটি একটি প্রকাশিত বইয়ে পাওয়া যায়। তার মানে এই প্রশ্ন এবং এর উত্তরগুলি ভবিষ্যতে অন্যদের পক্ষে ভালভাবে কার্যকর হতে পারে, যা টাইপ হিসাবে এটি বন্ধ করার জন্য একটি শক্তিশালী প্রতি-সূচক। (আপডেট: এই বিষয়টি এখন মেটাতে আলোচনা করা হচ্ছে ; দয়া করে সেখানে নির্দ্বিধায় বিবেচনা করুন feel)
কোডি গ্রে

3
সম্ভবত সর্বোত্তম উত্তরটি হবে: কোডটি সংকলনের চেষ্টা করুন; যদি এটি সংকলন না করে, এটি একটি ভাল ইঙ্গিত যে এটি টাইপো।
jrw32982 মনিকার সমর্থন করে

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

1
@ জন আমি এমএসভিসির সাথে কিছু ভাঁজ এক্সপ্রেশন চেষ্টা করেছি এবং সেগুলি সংকলন করিনি। এতটা স্পষ্টভাবে আমি পুরো অধ্যায়টি পড়েছি টাইপো হতে হবে? ;) সি ++ সংকলকগুলি সর্বদা বৈধ সি ++ কোড সংকলন করতে ব্যর্থ হয়, ভাষাটি উদ্বেগজনকভাবে জটিল থেকে আসে।
ভু

উত্তর:


205

এটি বইয়ের একটি টাইপো। তাকানো C ++ Programming Language এর 2nd এবং 3rd মুদ্রণ জন্য ত্রুটি-বিচ্যুতির । উদাহরণটি নীচের মতো হতে হবে:

auto z3 =[y]() { return (y) ? 1 : 2; }

11
কেন (y)এবং শুধু না y?
লিটল সহায়ক

7
@ লিটলহেল্পার এটি সম্ভবত সেরা অনুশীলন বা কিছু, আমি সবসময় এটিকে এমনভাবে লেখা দেখি। আরও জটিল তুলনা নিয়ে বিভ্রান্তি এড়াতে হতে পারে ...
রেডউল্ফ প্রোগ্রামগুলি

28
ব্যক্তিগতভাবে, আমি প্রায়শই (cond) ? a : bস্পষ্টতার জন্য ব্যবহার করি - এটি আমাকে ভুল পড়া থেকে বিরত রাখতে সহায়তা করে যেমন কোডের মাধ্যমে স্কিমিংয়ের সময় foo = x > y ? a : bযেমন বিবৃতিটি foo = x ...
user1686

8
@ লিটলহেল্পার এটি সত্যিই সেখানে প্রয়োজন হয় না। তবে কোনও ফাংশনের মতো ম্যাক্রোতে প্রথম বন্ধনী যেখানে ব্যবহৃত হয় সেগুলি চারপাশে রাখাই সেরা অনুশীলন, কারণ অন্যথায় যুক্তিগুলির প্রসারিত অপ্রত্যাশিত আচরণ দিতে পারে। "Foo (x) x * 2" এর মান দ্বিগুণ করার জন্য একটি ফাংশনের মতো ম্যাক্রো বিবেচনা করুন যেখানে আপনি "foo (2 + 3)" দিয়ে কল করেন। ফলাফলটি 2+ (3 * 2) হবে কারণ তর্কটি যেমন রয়েছে তেমন প্রসারিত হয় এবং অগ্রাধিকার নিয়মগুলি গ্রহণ করে। যদি আপনার ম্যাক্রো "foo (x) (x) * 2" হয় তবে আপনি সঠিকভাবে (2 + 3) * 2 পাবেন। এটি স্ট্রস্ট্রুপের কোডিং সুরক্ষার জন্য সর্বত্র সেই স্টাইলটি ব্যবহার করার অভ্যাস থাকতে পারে।
গ্রাহাম

2
@ গ্রাহাম স্ট্রাস্ট্রাপ মূলত ফাংশন ম্যাক্রো লিখেন না (সি ++ ইনলাইন ফাংশনগুলি আরও ভাল)। আরও বেশি সম্ভাবনা রয়েছে যে টেরিনারি অপারেটরের কিছুটা জটিল অগ্রাধিকার নিয়ম রয়েছে, তাই প্যারেন্সের সাথে অভ্যাসটি অভ্যাসগতভাবে পরিষ্কার করা ভাল।
মার্টিন বোনার

19

আমার কাছে সাধারণ টাইপের মতো লাগে। সম্ভবত হওয়া উচিত:

auto z3 =[y]() { return y ? 1 : 2; }

নোট করুন যেহেতু ল্যাম্বদা কোনও প্যারামিটার নেয় না তাই প্যারেন্সটি optionচ্ছিক। আপনি যদি এটি পছন্দ করেন তবে পরিবর্তে এটি ব্যবহার করতে পারেন:

auto z3 =[y] { return y ? 1 : 2; }

11

return 1 : 2; এটি একটি সিনট্যাক্স ত্রুটি, এটি বৈধ কোড নয়।

একটি সঠিক বিবৃতি return (y) ? 1 : 2;পরিবর্তে আরও পছন্দ হবে।

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