(++ 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.