ঠিক কীভাবে?: অপারেটর সি তে কাজ করে?


10

আমার একটি প্রশ্ন আছে, সংকলকটি নিম্নলিখিত কোডটিতে কীভাবে কাজ করে:

#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


1
আপনি কেন নিশ্চিত নন? আপনি আর কি আশা করবেন এবং কেন?
গেরহর্দ্ধ

2
জড়িত সুনির্দিষ্ট শব্দার্থের কথা আমি মনে করি না, তবে আপনি অপরিজ্ঞাত আচরণটি পর্যবেক্ষণ করতে পারেন।
চিপনার

3
না, @ চ্যাপনার, নির্বাচিত বিকল্পটি মূল্যায়ন করার আগে, একটি বার্ষিকীর অবস্থার মূল্যায়ন করার পরে একটি ক্রম বিন্দু রয়েছে। এটি ইউবি ভেক্টরটিকে এড়িয়ে যায় আমি মনে করি আপনি ভাবছেন।
জন বলিঞ্জার

হ্যাঁ, আমি নিশ্চিত নই যে আমি কম্পাইলারটির কোনও পছন্দ হবে বলে ভেবেছিলাম।
চিপনার

উত্তর:


6

ইন int d = (b == c++) ? (c+1) : (c-1);:

  • এর মান c++হ'ল বর্তমান মান c11, পৃথকভাবে, c12 এ বাড়ানো হয়।
  • b == 11মিথ্যা, যেহেতু b12।
  • যেহেতু (b == c++)মিথ্যা, (c-1)ব্যবহৃত হয়। এছাড়াও, c12- এর বর্ধিতকরণটি অবশ্যই এই পয়েন্টের সাথে শেষ করতে হবে।
  • যেহেতু c12, c-111।
  • d এই মান থেকে আরম্ভ করা হয়, 11।

5

সি স্ট্যান্ডার্ড অনুযায়ী (6.5.15 শর্তসাপেক্ষ অপারেটর)

4 প্রথম অপারেন্ড মূল্যায়ন করা হয়; এর মূল্যায়ন এবং দ্বিতীয় বা তৃতীয় অপারেন্ডের মূল্যায়ন (যেটি মূল্যায়ন করা হয়) এর মধ্যে একটি ক্রম বিন্দু রয়েছে। দ্বিতীয় অপারেন্ডটি কেবল তখনই মূল্যায়ন করা হয় যদি প্রথমটি 0 টির সাথে অসম তুলনা করে; তৃতীয় অপারেন্ড কেবল তখনই মূল্যায়ন করা হয় যদি প্রথমটির সাথে 0 টির সমান তুলনা করা হয়; ফলাফলটি হ'ল দ্বিতীয় বা তৃতীয় অপারেন্ডের মান (যার মধ্যে যাচাই করা হবে), নীচে বর্ণিত ধরণে রূপান্তরিত হয়েছে ১১১)

সুতরাং এই ঘোষণার শুরুতে প্রকাশ করুন

int d = (b == c++) ? (c+1) : (c-1);

ভেরিয়েবলটির bসাথে ভেরিয়েবলের মানটির তুলনা করা হয় cকারণ পোস্ট-ইনক্রিমেন্ট অপারেটর এটি বাড়ানোর আগে তার অপারেন্ডের মান প্রদান করে।

মানগুলি একে অপরের সমান না হওয়ায় ( b12 cএ সেট করা হয় যখন 11 তে সেট করা হয়) তবে উপ-এক্সপ্রেশনটি (c-1)মূল্যায়ন করা হয়।

উদ্ধৃতি অনুসারে অপারেটরের অবস্থার মূল্যায়নের পরে একটি সিকোয়েন্স পয়েন্ট রয়েছে। এর অর্থ হল শর্তটি মূল্যায়নের পরে ভেরিয়েবলের পরে পোস্ট-ইনক্রিমেন্ট অপারেটর প্রয়োগ করার পরে cমান রয়েছে । ফলস্বরূপ ভেরিয়েবল d মান ( ) দ্বারা আরম্ভ হয় ।12c112 - 1


2
একমাত্র সঠিক উত্তর - এই নির্দিষ্ট ক্ষেত্রে অবশ্যই সিকোয়েন্স পয়েন্টটি উল্লেখ করে উত্তর দেওয়া উচিত ?:। কারণ সাধারণত সিতে, ++একই অপরেন্ডে অন্যান্য ক্রিয়াকলাপের সাথে সংমিশ্রণ করা অনির্ধারিত আচরণ। এবং এই কোডটি কেবল অনুমানযোগ্যভাবে কাজ করে কারণ ?:এর বিভিন্ন বিশেষ স্নোফ্লেকের বিধি রয়েছে।
লন্ডিন

4

শর্তটি মিথ্যা বলে বিচারা করুন, সুতরাং কেসটি 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);
}

1
আমি মনে করি ওপি c++শর্ত অনুযায়ী প্রদত্ত অপারেশনগুলির আদেশের কথা উল্লেখ করছে । শর্তটি মিথ্যা, তবে এর মৌলিক মান cগণনা করতে ব্যবহৃত হয় c - 1, বর্ধিত সংস্করণ নয়।
চিপনার

1
আমি ভেবেছিলাম যে অদৃশ্য 12 == 11 + 1 এটি সত্য ...
J0S

তবে নতুন সি মানটি ব্যবহৃত হওয়ার পরে এটি সত্য নয় বা আমি আপনার পয়েন্টটি মিস করছি?
এরাকলন

আমি মনে করি একটি ভুল বোঝাবুঝি মধ্যে সেখানে হতে পারে c++এবং++c
ChatterOne

@ এন00 বি c++হ'ল পোস্ট- ইনক্রিমেন্ট অপারেটর। c++তৈরির পার্শ্ব প্রতিক্রিয়া সহ এর মান 11 c == 12++c12 এর মান হবে
চিপনার

4

আপনার কোডটি দেখতে দেখতে একটি নিয়মিত if-বিবৃতিতে অনুবাদিত:

int b=12, c=11;
int d;

if (b == c++)
   d = c+1;
else
   d = c-1;

এখানে ক্লুটি শর্তটি যাচাই করার পরে সি বৃদ্ধি করা হয়। সুতরাং আপনি elseরাজ্যে প্রবেশ করুন কিন্তু সি এর ইতিমধ্যে 12 এর মান রয়েছে।


1

পড়ুন তিন অপারেটর।

বাক্য গঠন

শর্ত? মান_আইফ_টি: মান_ফ_ফ্যালস

সুতরাং, আপনি লিখেছেন

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।

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