সি এবং সি ++ এ + = এর ফলাফল কী?


93

আমি নিম্নলিখিত কোড পেয়েছি:

#include <stdio.h>
int main(int argc, char **argv) {
    int i = 0;
    (i+=10)+=10;
    printf("i = %d\n", i);
    return 0;
}

আমি যদি এটি জিসিসি ব্যবহার করে সি উত্স হিসাবে সংকলন করার চেষ্টা করি তবে আমি একটি ত্রুটি পেয়েছি:

error: lvalue required as left operand of assignment

তবে আমি যদি এটি জি ++ ব্যবহার করে সি ++ উত্স হিসাবে সংকলন করি তবে আমি কোনও ত্রুটি পাই না এবং যখন আমি এক্সিকিউটেবল চালিত:

i = 20

কেন আলাদা আচরণ?


85
বিভিন্ন ভাষা, বিভিন্ন বাক্য গঠন নিয়ম ?. ব্যক্তিগতভাবে, আমি কোড-পর্যালোচনাতে সেই কোডটি প্রত্যাখাত করব।
সর্বোচ্চ

7
এই ইমো এর মতো কোডটি এড়িয়ে চলুন ... সবার জন্য অস্পষ্ট।
এ্যালায়ার

4
নিঃসন্দেহে, কোডটি পরিষ্কার নয় এবং "বাস্তব" বিকাশে এড়ানো উচিত। তবে তবুও, আমি একই আচরণ পর্যবেক্ষণ করি এবং এর কারণগুলি জানতে চাই।
ulidtko

9
এটি কোনও সফ্টওয়্যারটির আসল অংশের কোনও কোড অংশ নয়। এটি দুর্ঘটনাক্রমে আমি হোঁচট খেয়েছি just
স্বেতলিন ম্লাদেনভ

4
@ জোহানডিবলিং আমার মনে হয় এই উত্সটিটি বিশেষত (i + = 10) + = 10 আমি জানি না যে কোন ভাষায় বৈধ কোড এবং কোনটি তিনি সি ++ বলেছিলেন তা আসলে আমাকে উদ্বেগিত করে।
টনি 318

উত্তর:


133

যৌগিক অ্যাসাইনমেন্ট অপারেটরগুলির শব্দার্থবিজ্ঞান সি এবং সি ++ তে পৃথক:

C99 স্ট্যান্ডার্ড, 6.5.16, অংশ 3:

একটি অ্যাসাইনমেন্ট অপারেটর বাম অপারেন্ড দ্বারা মনোনীত বস্তুর মধ্যে একটি মান সঞ্চয় করে। একটি অ্যাসাইনমেন্ট এক্সপ্রেশন অ্যাসাইনমেন্টের পরে বাম অপারেন্ডের মান থাকে তবে এটি কোনও মূল্য হয় না।

সি ++ 5.17.1 এ:

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

সম্পাদনা:(i+=10)+=10 সি ++ এর আচরণটি সি ++ 98-এ সংজ্ঞায়িত করা হয়েছে, তবে সি ++ 11 এ ভালভাবে সংজ্ঞায়িত হয়েছে। মানকগুলির প্রাসঙ্গিক অংশগুলির জন্য এনপিইর প্রশ্নের উত্তরটি দেখুন ।


সঠিক। একজন ফলাফলের মান দেয়, এবং একজন পরিবর্তনশীল (ঠিকানা)
টেক্সাসব্রুস

7
গুরুত্বপূর্ণ : নোট যেটি (i+=10)+=10সি ++ তে অনির্ধারিত আচরণ, @aix উত্তর দেখুন।
ডেভিড রদ্রিগেজ - ড্রিবিস

@ DavidRodríguez-dribeas আপনি বোঝানো অনির্দিষ্ট না, অনির্দিষ্ট , ডান?
সের্গেই ক্যালিনিচেনকো

4
@ ডাসব্লিংকনলাইট: না, তার অর্থ অনির্ধারিত । সি ++ ০ এবং তার আগেরটিতে, এক্সপ্রেশনর লভালু ফলাফলটি পরিবর্তন করে হস্তক্ষেপ ক্রম বিন্দুর অভাবে সমস্ত সংকলকগুলিতে অনাকাঙ্ক্ষিত আচরণ করে । যদি এটি অনির্দিষ্ট করা হয় , তবে এটি অনুমানযোগ্য তবে বিভিন্ন সংকলকগুলিতে আলাদাভাবে আচরণ করবে ।
জাস্টিন ᚅᚔᚈᚄᚒᚔ

4
এটি int f(int &y); f(x += 10);কোনও ফাংশনে পরিবর্তিত ভেরিয়েবলের একটি রেফারেন্স পাস করার মতো একটি সেটিংয়ে কার্যকর হতে পারে।
ফিল মিলার

51

অবৈধ সি কোড ছাড়াও লাইন

(i+=10)+=10;

সি এবং সি ++ 03 উভয় ক্ষেত্রেই অপরিজ্ঞাত আচরণের ফলাফল ঘটবে কারণ এটি iক্রম পয়েন্টগুলির মধ্যে দ্বিগুণ সংশোধন করবে ।

কেন এটি সি ++ এ সংকলনের অনুমতি দেওয়া হয়েছে:

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

একই অনুচ্ছেদে বলে যে

সমস্ত ক্ষেত্রে, অ্যাসাইনমেন্টটি ডান এবং বাম অপারেন্ডগুলির মান গণনার পরে এবং অ্যাসাইনমেন্ট এক্সপ্রেশনটির মান গণনার আগে ক্রমযুক্ত হয়।

এটি পরামর্শ দেয় যে সি ++ 11 এ, এক্সপ্রেশনটির আর নির্ধারিত আচরণ নেই।


4
ঠিক আছে, এটি অবশ্যই সিকোয়েন্স পয়েন্টগুলির কারণে ইউবি। এটি সিতেও অবৈধ কোড (তবে সি ++ নয়) তবে এটি সিকোয়েন্স পয়েন্টগুলির সাথে সম্পর্কিত নয় এবং এটি সংকলক দ্বারা ধরা উচিত।
কনরাড রুডল্ফ

4
@ কনরাডরুডল্ফ: না, সংকলকটি সংশোধিত কোডের বিপরীতে অপরিজ্ঞিত আচরণ ধরতে বাধ্য নয়। "সংকলকটির দ্বারা ধরা উচিত" অংশটি যেখানে আমরা একমত নই।

4
সিকোয়েন্স পয়েন্টগুলি সি ++ 11 এ বিদ্যমান নেই, সুতরাং iইউবির আসল কারণ হ'ল সেখানে দুটি পরিবর্তন রয়েছে যা অনিচ্ছাকৃত।
মনকারসে

4
এটি মিথ্যা যে এটি নির্ধারিত আচরণ। অ্যাসাইনমেন্ট এক্সপ্রেশনটির মান গণনার আগে যদি অ্যাসাইনমেন্টটি ক্রম না হয় তবে i = j+=1তার ফলে একটি অনির্দিষ্ট মান হতে পারে। একই অনুচ্ছেদ থেকে আপনি উদ্ধৃতি দিয়েছিলেন "সমস্ত ক্ষেত্রে, অ্যাসাইনমেন্টটি ডান এবং বাম অপারেন্ডগুলির মান গণনার পরে এবং অ্যাসাইনমেন্ট এক্সপ্রেশনটির মান গণনার আগে ক্রমযুক্ত হয়" " সুতরাং (i+=10)+=10ভাল করতে সংজ্ঞায়িত করা হয় i += 10; i += 10;। অন্যদিকে (i+=10)+=(i+=10)ইউবি।
bames53

4
যেহেতু আমি দেখেছি যে মন্তব্যকারীদের মধ্যে এই সম্পর্কে কিছুটা মতবিরোধ ছিল, তাই আমি এটি একটি পৃথক প্রশ্ন হিসাবে পোস্ট করেছি: stackoverflow.com/questions/10655290/…
এনপিই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.