(++ i) ++ বৈধ থাকাকালীন কেন "++ i ++" অবৈধ?


14

আসুন নীচের কোডটি বিবেচনা করুন:

int main() {
    int i = 2;
    int b = ++i++;
    return 3;
}

এটি একটি ত্রুটির সাথে নিম্নলিখিতটি সংকলন করে:

<source>: In function 'int main()':

<source>:3:16: error: lvalue required as increment operand

    3 |     int b = ++i++;

      |                ^~

এটা আমার কাছে ফর্সা লাগছে। প্রিফিক্স ইনক্রিমেন্টের তুলনায় পোস্টফিক্স ইনক্রিমেন্টের উচ্চ অগ্রাধিকার রয়েছে, সুতরাং কোডটি পার্স করা হয়েছে int b = ++(i++);এবং iএটি একটি মূল্যমান। সুতরাং ত্রুটি।

আসুন এখন ডিফল্ট অগ্রাধিকারগুলিকে ওভাররাইড করার জন্য বন্ধুত্বের সাথে এই রূপটি বিবেচনা করুন:

int main() {
    int i = 2;
    int b = (++i)++;
    return 3;
}

এই কোডটি সংকলন করে এবং ফেরত দেয় 3.. এটি নিজে থেকে, এটি আমার কাছে ভাল লাগে তবে এটি প্রথম কোডের সাথে বৈপরীত্য বলে মনে হয়।

প্রশ্ন: কেন (++i)একটি হল lvalueযখন iনয়?

ধন্যবাদ!

আপডেট: উপরে প্রদর্শিত ত্রুটি বার্তাটি জিসিসি থেকে হয়েছিল (x86-64 9.2)। এখানে নিখুঁত রেন্ডারিং: জিসিসি সহ ত্রুটি

ঝনঝন x86-64 9.0.0 এর বেশ আলাদা বার্তা রয়েছে: ঝাঁকুনিতে ত্রুটি

<source>:3:13: error: expression is not assignable

    int b = ++i++;

            ^ ~~~

জিসিসির সাথে, আপনি এই ধারণাটি পান যে সমস্যাটি পোস্টফিক্স অপারেটরের সাথে রয়েছে এবং তারপরে আপনি ঘুরে বেড়াতে পারেন কেন ++iঠিক নেই কেন i, তবে আমার প্রশ্ন। কলঙ্কের সাথে এটি স্পষ্ট হয় যে সমস্যাটি প্রিফিক্স অপারেটরের সাথে।


এটি মূলত সি এর সাথে ট্যাগ করা হয়েছিল, এটি অবশ্যই বৈধ নয় সি
— অ্যান্টি হাপাল

সত্যিই দুঃখিত! আমি ধরে
— নিয়েছিলাম

উত্তর:


23

iএবং ++iউভয়ই মূল্যবান, তবে i++এটি একটি মূল্যবান।

++(i++)বৈধ হতে পারে না, যেমন উপসর্গ ++প্রয়োগ করা হচ্ছে i++, যা একটি মূল্য। তবে (++i)++এটি ঠিক আছে কারণ ++iএটি একটি মূল্যমান।

উল্লেখ্য যে সি তে পরিস্থিতি আলাদা; i++এবং ++iউভয় মূল্যবোধ হয়। (লোকেরা কেন সি এবং সি ++ এর একই নিয়ম আছে তা ধরে নেওয়া উচিত না এর একটি উদাহরণ People লোকেরা তাদের প্রশ্নগুলিতে এই অনুমানগুলি sertোকান, যা অবশ্যই খণ্ডন করা উচিত))


4

এই ঘোষণা

int b = ++i++;

সমতুল্য

int b = ++( i++ );

পোস্টফিক্স ইনক্রিমেন্ট অপারেটর ইনক্রিমেন্টের আগে অপারেন্ডের মান প্রদান করে।

সি ++ 17 স্ট্যান্ডার্ড থেকে (8.2.6 বৃদ্ধি এবং হ্রাস)

1 পোস্টফিক্স ++ এক্সপ্রেশনটির মান হ'ল তার অপারেন্ডের মান ... ফলাফলটি একটি মূল্য ।

যখন অ্যানারি ইনক্রিমেন্ট অপারেটর তার ইনক্রিমেন্টের পরে লভ্যু দেয়। সুতরাং এই ঘোষণা

int b = (++i)++;

বৈধ. আপনি উদাহরণস্বরূপ লিখতে পারে

int b = (++++++++i)++;

সি ++ 17 স্ট্যান্ডার্ড থেকে (8.3.2 বৃদ্ধি এবং হ্রাস)

1 উপসর্গ ++ এর অপারেন্ড যোগ করে 1 সংশোধিত করা হয়। অপারেন্ডটি একটি পরিবর্তনযোগ্য লভ্যালু হবে। অপারেন্ডের ধরণটি সিভি বুল ব্যতীত একটি গাণিতিক প্রকার বা সম্পূর্ণ নির্ধারিত অবজেক্টের ধরণের পয়েন্টার হতে হবে। ফলাফল আপডেট অপারেন্ড; এটি একটি মূল্যবান এবং অপারেন্ডটি যদি একটি বিট-ফিল্ড হয় তবে এটি একটি বিট-ফিল্ড ....

মনোযোগ দিন যে সিতে উভয় অপারেটর লভ্যালুর পরিবর্তে একটি মান ফেরত দেয়। সুতরাং সি এই ঘোষণা

int b = (++i)++;

অবৈধ.


3

সুতরাং কোডটি ইন্ট বি = ++ (আই ++) হিসাবে পার্স করা হয়েছে; এবং আমি একটি মূল্যবান।

না i। কোন মূল্য নেই। iএকটি মূল্যবান। i++হ'ল একটি মূল্য (নির্দিষ্ট হতে হবে)

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