এই যদি বিবৃতিটি অ্যাসাইনমেন্ট এবং সমতা পরীক্ষার সমন্বয় করে কেন সত্য হয়?


216

আমি কিছু প্রাথমিক ভুল সম্পর্কে ভাবছিলাম এবং আমি ifবিবৃতিটির সাথে শেষ করেছি । আমি এতে কিছুটা কোড প্রসারিত করেছি:

int i = 0;
if (i = 1 && i == 0) {
    std::cout << i;
}

আমি দেখেছি যে ifবিবৃতি আয় সত্য, এবং এটি cout'গুলি iযেমন 1। যদি iনির্ধারিত হয় 1যদি বিবৃতি কেন এ i == 0প্রত্যাবর্তন true?


83
বন্ধুরা, এটি কোনও টাইপোর প্রশ্ন নয়। ওপিতে জানতে চাইছে যে, কেন এই আইনের সাথে এই কোডটি প্রবেশ করানো হয়েছে iসেট থেকে সেট করা আছে 1
নাথান অলিভার

24
বা এর ফলাফল নির্ধারণ করে 1 && i == 0?
JVApen

4
নতুনদের জন্য পরামর্শ: তাদের এ জাতীয় "উন্নত" ভাষা ব্যবহার করা উচিত নয়। কেবল পৃথকভাবে ভেরিয়েবল বরাদ্দ করুন। এটি সিকোয়েন্স পয়েন্ট সহ সম্ভাব্য সমস্যাগুলি এড়াবে। ব্যবহারিক কোডে এই জাতীয় কোডটি সাধারণত খারাপ দেখায়।
ব্যবহারকারী 202729

1
এটি একটি সাক্ষাত্কারের প্রশ্নে শেষ হতে বাধ্য
RAZ_Muh_Taz

উত্তর:


391

এটি অপারেটর অগ্রাধিকার সঙ্গে করতে হবে ।

if (i = 1 && i == 0)

এটি না

if ((i = 1) && (i == 0))

কারণ উভয় &&এবং ==তুলনায় একটি উচ্চতর প্রাধান্য আছে =। এটি আসলে কী কাজ করে তা হল

if (i = (1 && (i == 0)))

যা ফলাফল নির্ধারিত 1 && (i == 0)করে i। সুতরাং, যদি iএ শুরু হবে 0তারপর i == 0হয় true, তাই 1 && trueহল true(অথবা 1), এবং তারপর iসেট পরার 1। তারপর যেহেতু 1সত্য, আপনি if সন্নিবেশ করান এবং আপনাকে নির্ধারিত মানটি মুদ্রণ করুন i


2
পছন্দ করুন আমি পছন্দ করি এটি আপনাকে প্রথম বন্ধনী ব্যবহার করতে বাধ্য করে।
নাথান অলিভার

মূলত, i = !i; if (i)যথাযথভাবে লিখিত
কাকাহুয়েত ফ্রিটো

@ নাথান অলিভার: দুর্গ একটি দুর্দান্ত ভাষা ছিল যা অনেক কিছুই ঠিকঠাক পেয়েছিল। (লিড ডিজাইনার ছিলেন গাই এল স্টিল, সুতরাং সেখানে কোনও অবাক হওয়ার কিছু নেই।) দুর্ভাগ্যক্রমে, এটি DARPA তহবিলের চূড়ান্ত রাউন্ডে উঠেনি, এবং পরবর্তীকালে ওরাকল তাকে বিদ্রূপ করেছিল।
জার্গ ডব্লু মিটাগ

6
স্বাভাবিকভাবেই, সংকলকটির কাছ থেকে সতর্কতার একটি মডিকাম জিজ্ঞাসা করলে সেই ত্রুটিটি সনাক্ত করা যেত,
ডিসিপ্লিকেটর

4
যে কোনও ভাষা যা কালি এবং বুলেট সমান নয় তাও এটিকে বেছে নেবে।
rghome

16

আপনার কোড ধরে নিলে বাস্তবে এরকম দেখাচ্ছে:

#include <iostream>
using namespace std;

int main()  {
    int i = 0;
    if (i = 1 && i == 0) {
        cout << i;
    }
}

তারপর এই:

if (i = 1 && i == 0) {

হিসাবে মূল্যায়ন

 if (i = (1 && i == 0)) {

এবং তাই iসেট করা হয় 1


39
অতিরিক্ত কোডটি কি সত্যিই প্রয়োজনীয় ছিল? এটি বেশ সুস্পষ্ট বলে মনে হয় এটি অন্যথায় চলবে না বলেই এটি ঘটবে।
মডেলমেট

13
কেবল অপ্রয়োজনীয় অতিরিক্ত কোড নয়। উত্তরটি অপারেটরের নজির পরিষ্কারভাবে ব্যাখ্যা করতে ব্যর্থ।
ফ্রান্সিসকো জারাবোজো

34
যেহেতু আমরা নিটপিক ট্রেনে রয়েছি ... আমি দেখছি using namespace std!
মতিন উলহাক

8
অতিরিক্ত কোড রয়েছে - তবে এটি এখনও ভুল কোড নয়। এবং উত্তর এখনও সঠিক। অবশ্যই এটি অপারেটর নজির ব্যাখ্যা করে না। তবে কেউ একেবারে ডাউন-ভোটিংয়ের পরিবর্তে এটি যুক্ত করার পরামর্শ দিতে পারে!
বি চার্লস এইচ

14
বাহ, -4 কঠোর, এই প্রশ্নের উত্তরটি সঠিকভাবে বিবেচনা করে, যদিও সম্ভবত অনুকূল নয় ti এটি অন্যান্য উত্তরের মতো অপারেটর প্রাধান্যটিতে প্রসারিত হয় না, তবে কোডের প্রসঙ্গে এটি সম্পর্কে যথেষ্ট পরিমাণে বলা হয়েছে যাতে যে কেউ যে =আগে এসেছিল বলে মনে হয় &&তারা সমস্যাটি দেখতে পারে। এছাড়াও, হ্যাঁ, সম্প্রসারণ বহিরাগত, তবে আমি মনে করি না যে এটি এতটা গুরুত্বপূর্ণ। আমি বিশ্বাস করতে পারি না যে এই ধরনের ছোটখাটো পার্থক্যের কারণে লোকেরা 151 থেকে -4 ভোট দেয়।
জোল

-4

এটি ডান থেকে বামে বিধি বিধানের সাথে সম্পর্কিত। যেমন y = x + 5।
সমস্ত উপ-এক্সপ্রেশন গুরুত্ব সহ্য করা হয়। সমান গুরুত্বের দুটি অভিব্যক্তি ডান থেকে বামে মূল্যায়ন করা হয়,। অ্যান্ড অ্যান্ড এক্সপ্রেশন দিকটি প্রথমে এলএইচএসের পরে করা হয়।

আমার কাছে যৌক্তিক.


1
অ্যাসোসিয়েটিভিটির ("ডান থেকে বাম নিয়ম") এর সাথে কিছুই করার নেই। এটা তোলে প্রাধান্য ( "গুরুত্ব") সম্পর্কে, এবং ব্যবহৃত অপারেটার না সমান প্রাধান্য আছে।
30:38

-4

আসল উত্তরটি হ'ল:

  1. সংকলক "i == 0" কে অগ্রাধিকার দেয় , যা সত্যকে মূল্যায়ন করে।
  2. তারপরে এটি i = 1 টি সত্য বা মিথ্যা হিসাবে মূল্যায়ন করবে এবং যেহেতু সংকলিত অ্যাসাইনমেন্ট অপারেটরগুলি কখনই ব্যর্থ হয় না (অন্যথায় তারা সংকলন করবে না), এটি সত্যেরও মূল্যায়ন করে।
  3. যেহেতু উভয় বিবৃতি সত্য হিসাবে মূল্যায়ন করে, এবং সত্য ও & সত্য সত্যের কাছে মূল্যায়ন করে, যদি বিবৃতিটি সত্যে মূল্যায়ন করে।

প্রমাণ হিসাবে, আপনি যে কোডটি প্রবেশ করেছেন তার জন্য কেবল আপনার সংকলকটির এসএমআউট আউটপুট দেখুন (সমস্ত মন্তব্য আমার নিজস্ব)

mov     dword ptr [rbp - 8], 0    ; i = 0;
cmp     dword ptr [rbp - 8], 0    ; i == 0?
sete    al                        ; TRUE (=1)
mov     cl, al
and     cl, 1                     ; = operator always TRUE
movzx   edx, cl
mov     dword ptr [rbp - 8], edx  ; set i=TRUE;
test    al, 1                     ; al never changed,
                                  ; so final ans is TRUE

উপরের asm আউটপুটটি ক্লাং থেকে ছিল, তবে অন্য যে সমস্ত সংকলক আমি তাকিয়েছিলাম সেগুলি একই ধরণের আউটপুট দেয়। এটি সেই সাইটের সমস্ত সংকলকগুলির ক্ষেত্রে সত্য, তারা খাঁটি সি বা সি ++ সংকলক কিনা, কম্পাইলারের মোড পরিবর্তনের জন্য কোনও প্রগমাস ছাড়াই (যা সি ++ সংকলকগুলির জন্য ডিফল্টরূপে সি ++ হয়)

নোট করুন যে আপনার সংকলকটি আসলে i = 1 সেট করে নি, তবে i = সত্য (যার অর্থ কোনও 32-বিট শূন্যের পূর্ণসংখ্যার মান নয়)। কারণ && অপারেটর কেবল কোনও বিবৃতি সত্য বা মিথ্যা কিনা তা মূল্যায়ন করে এবং তারপরে ফলাফল অনুযায়ী ফলাফল নির্ধারণ করে। প্রমাণ হিসাবে, i = 1 থেকে i = 2 পরিবর্তন করার চেষ্টা করুন এবং আপনি নিজের জন্য পর্যবেক্ষণ করতে পারেন যে কোনও কিছুই পরিবর্তিত হবে না। কম্পাইলার এক্সপ্লোরারে কোনও অনলাইন সংকলক ব্যবহার করে নিজের জন্য দেখুন


1
1) এই প্রশ্নটি যখন সি ++ এর সাথে ট্যাগ করা হয় তখন ডকগুলি সি অপারেটর অগ্রাধিকারের সাথে লিঙ্ক করে। দুটি ভিন্ন ভাষা। 2 ক) i = 1একটি অ্যাসাইনমেন্ট [সমতুল্য নয়] অপারেটর; 2 খ) আমি আপনাকে আশ্বাস দিতে পারি যে if (i = 0)সি এবং সি ++ উভয় ক্ষেত্রেই ভুয়া অবস্থার মূল্যায়ন করবে, সুতরাং এটি সত্যিকারের আর্ট "এটি কখনই ব্যর্থ হয় না" - এর মূল্যায়ন কিনা কিছুটা বিভ্রান্তিকর।
ট্রেডজেড

1
and cl, 1 ; = operator always TRUE<< আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমি এখানে কোনও নিয়োগ দেখছি না। এটি ভাবের 1 &&অংশকে উপস্থাপন করে । সুতরাং এই উত্তরটি মূলত মূল্যায়ন করে false

"এই প্রশ্নটি যখন সি ++ এর সাথে ট্যাগ করা হয় তখন দস্তাবেজগুলি সি অপারেটর অগ্রাধিকারের সাথে যুক্ত হয় Two দুটি পৃথক ভাষা" - এবং আপনি যখন সি ++ অপারেটরের অগ্রাধিকারের সাথে তুলনা করেন, তখন উভয়ের মধ্যে পার্থক্য কী? এই বিষয়টির ক্ষেত্রে তাদের একই নজির রয়েছে, যা অবাক হওয়ার মতো নয়, কারণ C ++ সি এর সরাসরি ডাইরিভেটিভ (বা এটি দেওয়ার অন্য কোনও উপায় হ'ল সি ++ ভাষার একটি উপসেট, সুতরাং অবশ্যই তাদের অবশ্যই থাকবে) অগ্রাধিকার সহ) প্রচুর সাধারণ। বিভ্রান্তিকর ক্ষেত্রে আমি যাইহোক আমার পোস্ট ঠিক করব।
18

"আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমি এখানে কোনও নিয়োগ দেখছি না" - তাহলে আমাকে আপনাকে সংশোধন করতে দিন! 1 টি একটি তাত্ক্ষণিক মান এবং কোনও পরীক্ষা বা গণনার ফলাফল নয়। এটিকেই "অনুমিত সত্য" মান বলা হয়। কেবলমাত্র পরীক্ষাটি হ'ল i == 0 স্টেটমেন্টের জন্য, যেমন - "সিএমপি ডওয়ার্ড পিটিআর [আরবিপি - 8], 0"। আপনি কেবল তখনই সঠিক হতে পারেন যদি এটি "মুভজেক্স এডেক্স, 1" বলেছিল। আমার আগের সমস্ত পোস্ট অনুসারে, দুটি তুলনা হওয়া উচিত, তবে বাস্তব জীবনে কেবল একটিই রয়েছে এবং প্রত্যেকটি বড় সংকলকের এসএম আউটপুট প্রমাণ করে যে এই পোস্টগুলি সম্পূর্ণ ভুল।
ar18

2
অগ্রাধিকারটি ভুল হওয়ার পাশাপাশি (সঠিক পার্সিংয়ের জন্য নাথান অলিভারের উত্তর দেখুন), আপনি মিথ্যা দাবি করেন যে অ্যাসাইনমেন্ট অপারেটর সর্বদা সত্যের দিকে অগ্রসর হয়। ব্যবহার করে দেখুন if ( i = 0 ) { print something }। এছাড়াও আপনার উত্তর নিজেই স্ববিরোধী; শুরুতে আপনি বলুন যে প্রয়োগ i=1হওয়ার আগে মূল্যায়ন &&করা হয়, এবং তারপরে আপনি বলে যে অপারেটরের iফলাফলের জন্য সেট করা আছে &&
এমএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.