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


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.