আমার একটি প্রশ্ন আছে, সংকলকটি নিম্নলিখিত কোডটিতে কীভাবে কাজ করে:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
আমি নিশ্চিত কেন ফল নই d = 11
।
আমার একটি প্রশ্ন আছে, সংকলকটি নিম্নলিখিত কোডটিতে কীভাবে কাজ করে:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
আমি নিশ্চিত কেন ফল নই d = 11
।
উত্তর:
ইন int d = (b == c++) ? (c+1) : (c-1);
:
c++
হ'ল বর্তমান মান c
11, পৃথকভাবে, c
12 এ বাড়ানো হয়।b == 11
মিথ্যা, যেহেতু b
12।(b == c++)
মিথ্যা, (c-1)
ব্যবহৃত হয়। এছাড়াও, c
12- এর বর্ধিতকরণটি অবশ্যই এই পয়েন্টের সাথে শেষ করতে হবে।c
12, c-1
11।d
এই মান থেকে আরম্ভ করা হয়, 11।সি স্ট্যান্ডার্ড অনুযায়ী (6.5.15 শর্তসাপেক্ষ অপারেটর)
4 প্রথম অপারেন্ড মূল্যায়ন করা হয়; এর মূল্যায়ন এবং দ্বিতীয় বা তৃতীয় অপারেন্ডের মূল্যায়ন (যেটি মূল্যায়ন করা হয়) এর মধ্যে একটি ক্রম বিন্দু রয়েছে। দ্বিতীয় অপারেন্ডটি কেবল তখনই মূল্যায়ন করা হয় যদি প্রথমটি 0 টির সাথে অসম তুলনা করে; তৃতীয় অপারেন্ড কেবল তখনই মূল্যায়ন করা হয় যদি প্রথমটির সাথে 0 টির সমান তুলনা করা হয়; ফলাফলটি হ'ল দ্বিতীয় বা তৃতীয় অপারেন্ডের মান (যার মধ্যে যাচাই করা হবে), নীচে বর্ণিত ধরণে রূপান্তরিত হয়েছে ১১১)
সুতরাং এই ঘোষণার শুরুতে প্রকাশ করুন
int d = (b == c++) ? (c+1) : (c-1);
ভেরিয়েবলটির b
সাথে ভেরিয়েবলের মানটির তুলনা করা হয় c
কারণ পোস্ট-ইনক্রিমেন্ট অপারেটর এটি বাড়ানোর আগে তার অপারেন্ডের মান প্রদান করে।
মানগুলি একে অপরের সমান না হওয়ায় ( b
12 c
এ সেট করা হয় যখন 11 তে সেট করা হয়) তবে উপ-এক্সপ্রেশনটি (c-1)
মূল্যায়ন করা হয়।
উদ্ধৃতি অনুসারে অপারেটরের অবস্থার মূল্যায়নের পরে একটি সিকোয়েন্স পয়েন্ট রয়েছে। এর অর্থ হল শর্তটি মূল্যায়নের পরে ভেরিয়েবলের পরে পোস্ট-ইনক্রিমেন্ট অপারেটর প্রয়োগ করার পরে c
মান রয়েছে । ফলস্বরূপ ভেরিয়েবল d মান ( ) দ্বারা আরম্ভ হয় ।12
c
1
12 - 1
?:
। কারণ সাধারণত সিতে, ++
একই অপরেন্ডে অন্যান্য ক্রিয়াকলাপের সাথে সংমিশ্রণ করা অনির্ধারিত আচরণ। এবং এই কোডটি কেবল অনুমানযোগ্যভাবে কাজ করে কারণ ?:
এর বিভিন্ন বিশেষ স্নোফ্লেকের বিধি রয়েছে।
শর্তটি মিথ্যা বলে বিচারা করুন, সুতরাং কেসটি false
ঘটবে: c-1
তবে আপনি যেহেতু c
শর্তটি বাড়িয়েছেন c++
, তাই c
এখন 12
। ফলাফলটি এভাবে 12 - 1 যা 11।
সম্পাদনা: ওপিকে যা ভুল বুঝেছিল তা হ'ল পোস্ট ইনক্রিমেন্ট।
সুতরাং আসলে যা ঘটে তা হ'ল:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d;
if (b == c) { // 12 == 11 ? -> false
c = c + 1;
d = c + 1;
} else { // this executes since condition is false
c = c + 1; // post increment -> c++ -> c = 12 now
d = c - 1; // 12 - 1 = 11 -> d = 11
}
printf("d = %i\n", d);
}
c++
শর্ত অনুযায়ী প্রদত্ত অপারেশনগুলির আদেশের কথা উল্লেখ করছে । শর্তটি মিথ্যা, তবে এর মৌলিক মান c
গণনা করতে ব্যবহৃত হয় c - 1
, বর্ধিত সংস্করণ নয়।
c++
এবং++c
c++
হ'ল পোস্ট- ইনক্রিমেন্ট অপারেটর। c++
তৈরির পার্শ্ব প্রতিক্রিয়া সহ এর মান 11 c == 12
। ++c
12 এর মান হবে
পড়ুন তিন অপারেটর।
বাক্য গঠন
শর্ত? মান_আইফ_টি: মান_ফ_ফ্যালস
সুতরাং, আপনি লিখেছেন
int d = (b == c++) ? (c+1) : (c-1);
এই পরিস্থিতিতে, ফলাফলটি 11 হবে কারণ, যদি চেক করা হয় তবে 'সি' মান বৃদ্ধি করা হবে (সি + 1 = 12) এবং তারপরেই এটি 'ডি' মান সি (12) -1 হিসাবে সেট করে যা 11।
আপনি যদি ব্যবহার করেন তবে উদাহরণস্বরূপ:
int d = (b == ++c) ? (c+1) : (c-1);
"c" মানটি বিবৃতিটি যাচাই করার আগে বাড়ানো হবে, সুতরাং এটি সত্য হবে এবং "d" মান হবে c (12) +1 যা 13।