6
2

C এবং PHP -তে একই কোডে আউটপুট ভিন্ন কেনো ...... এবং কোনটি সঠিক আউটপুট ...

C Code :

#include < stdio.h>
int main()
{
    int x=5;
    printf("%d\n",x);
    x=x++ + x++;
    printf("%d\n",x);
    x=x-- - x--;
    printf("%d\n",x);

    return 0;
}

PHP Code :

< ?php
    $x=5;
    echo $x."</br>";
    $x=$x++ + $x++;
    echo $x."</br>";
    $x=$x-- - $x--;
    echo $x."</br>";

?>

C output :

5
12
-2

PHP output :

5
11
1

asked 02 Feb '15, 19:52

Shipu's gravatar image

Shipu
736

edited 03 Feb '15, 08:44

Tamim%20Shahriar%20Subeen's gravatar image

Tamim Shahriar Subeen ♦♦
5.3k1026


সি তে x=x++ + x++; এর মান কী হবে সেটা বলা যায় না, এটা আনডিফাইনড বিহেভিয়র (undefined behavior)। এখানে ব্যাখ্যা দেওয়া আছে : http://en.cppreference.com/w/cpp/language/eval_order

এই এক্স প্লাস প্লাস (x++) বিষয়টা কিন্তু প্রোগ্রামিং এর বিষয় না, এটা ল্যাঙ্গুয়েজ স্পেসিফিক। x = x + 1 এর সংক্ষিপ্তরূপ হচ্ছে x++। যেমন পাইথনে x++ লেখা যায় না। আমি দেখি আমাদের দেশে ভার্সিটিতে শিক্ষকরা প্রথম সেমিস্টারে x++, ++x এসব নিয়ে জটিল জটিল প্রশ্ন করেন, বইতেও আছে। কিন্তু আমার মতে এটা নিয়ে মাথা ঘামানো সময় নষ্ট ছাড়া আর কিছুই না। এর চেয়েও অনেক জরুরী জিনিস আছে। বরং এসব অপ্রয়োজনীয় জিনিস অনেক শিক্ষার্থীর আত্মবিশ্বাস কমিয়ে দেয়।

permanent link

answered 03 Feb '15, 04:12

Tamim%20Shahriar%20Subeen's gravatar image

Tamim Shahriar Subeen ♦♦
5.3k1026

edited 03 Feb '15, 08:43

The C/C++ and PHP both output is expected.It is hard to explain with an answer why C/C++ is producing that output and why PHP is different.But at real life a programmer never use post-increament and pre-increament like that way.So it is wasting of time to understand example code.

(26 May '15, 16:12) shaiful

@mabdsalam12 এর উত্তর কেন ভুল সেটার ব্যাখ্যা :

"ইনক্রিমেন্ট কিংবা ডিক্রিমেন্ট এর ক্ষেত্রে সি কিংবা সি++ এর এক এক কম্পাইলার এক এক রকম আউটপুট দেয়। এটা অনেক পুরানো কথা।" এটা ভুল কথা। ইনক্রিমেন্ট বা ডিক্রিমেন্টের ক্ষেত্রে সব কম্পাইলার একই রকম ব্যবহার করবে। কিন্তু যেসব ক্ষেত্রে বিষয়টা undefined (যেমন: i = i++ + ++i), সেসব ক্ষেত্রে কী আউটপুট আসবে সেটা বলা যায় না, কারণ যেহেতু undefined তাই এভাবে লেখাই যাবে না। য়দিও এর জন্য কম্পাইলার কোনো এরর দেয় না।

পিএইচপি'র ক্ষেত্রে বিষয়টা আনডিফাইনড কী না সেটা আলাদাভাবে কোথাও উল্লেখ করা নাই। কিন্তু পিএইচপি যেহেতু সি এর উপর ভিত্তি করেই তৈরি, তাই আমরা ধরে নিতে পারি যে এটা আনডিফাইনড। তাই বিস্তারিত ব্যাখ্যাটা যদিও আপাতদৃষ্টিতে গ্রহণয়োগ্য মনে হচ্ছে, কিন্তু এটা আসলে সঠিক ব্যাখ্যা নয়। কারণ এটার কোনো ব্যাখ্যা নাই। কারণ ‍$x = $x++ + $x++;‍ এর জন্য এই ব্যাখ্যাটাও গ্রহনযোগ্য : বামদিকের $x++ এর কারণে এখানে $x এর মান 5 আসবে কিন্তু তারপরে মানে বেড়ে 6 হবে। তারপরে ডানদিকের $x++ এর কারণে এখানে $x এর মান হবে 6, ইনক্রিমেন্টটা পরে হবে। তারপর দুটো ঘটনা ঘটতে পারে, $x = 5 + 6 বা $x = 11 এবং তারপরে $x এর মানের ইনক্রিমেন্টটা হবে, তাহলে $x এর মানে দাঁড়াবে 7। আবার $x এর মান বেড়ে 7 হবে, তারপর $x = 5 + 6, বা $x এর মান 11 হবে। কোনটা আগে হবে সেটা গ্যারান্টি দেওয়া যাচ্ছে না। তাই এটাকে আনডিফাইনড বলা যায়। ব্যাপারটা আরো পরিষ্কারভাবে বুঝতে এই লেখাটা পড়া যেতে পারে : http://c-faq.com/expr/seqpoints.html

সহজ ভাষায় বললে, কোনো এক্সপ্রেশনে কোনো ভেরিয়েবলের মান একাধিকবার পরিবর্তন হতে পারবে না।

ইনক্রিমেন্ট/ডিক্রিমেন্ট এর ব্যবহার কেবল $i++ (বা ++$i), $i-- (বা --$i) এর মধ্যেই সীমাবদ্ধ রাখা উচিত। এটি নিয়ে অযথা সময় নষ্ট করা নির্বুদ্ধিতার পরিচয়।

permanent link

answered 03 Feb '15, 08:10

Tamim%20Shahriar%20Subeen's gravatar image

Tamim Shahriar Subeen ♦♦
5.3k1026

ব্যাপারটা পরিস্কার ... অযথা সময় নষ্ট করার কোন কারণ নাই এর চেয়েও অনেক জরুরী জিনিস আছে ...... ধন্যবাদ........................... @subeen (@tamim) ভাই

(03 Feb '15, 20:34) Shipu

আমি আসলে ক্লাসে যখন করতাম তখন এক এক পিসিতে এক এক কম্পাইলার ইন্সটল করা থাকত। তখন দেখতাম যে একই কোন আলাদা আলাদা আউটপুট।

(29 Mar '15, 06:56) mabdsalam12

ইনক্রিমেন্ট কিংবা ডিক্রিমেন্ট এর ক্ষেত্রে সি কিংবা সি++ এর এক এক কম্পাইলার এক এক রকম আউটপুট দেয়। এটা অনেক পুরানো কথা। তবে আমার মতে এখানে PHP এর আউটপুট সঠিক আছে।

একটু ব্যাখ্যা করা যাক

$x=5;
echo $x."</br>";

এখানে যে 5 প্রিন্ট করবে তাতে কোন সন্দেহ নাই।

$x=$x++ + $x++;

পোস্ট ইনক্রিমেন্টের ক্ষেত্রে প্রথমে মান গ্রহন করে তারপর তার মান এক বৃদ্ধি করে। তাহলে প্রথম $x++ এর মান হিসেবে 5 ধরা হল এবং $x এর মান এক বৃদ্ধি পেল। তারপর + বসল। + এর পর আবার যখন $x++ পাওয়া গেল তখন $x এর মান হিসেবে পাওয়া গেল 6 এবং $x এর মান এক বৃদ্ধি হয়ে 7 হল। তাহলে আমাদের সমীকরনটা দারাল এমনঃ

$x=5+6

এই সমীকরনটা এক্সিকিউট হবার আগ পর্যন্ত $x এর মান 7 এবং সমীকরনটা এক্সিকিউট হবার পর $x এর মান হল 11

echo $x."</br>";

এখানে 11 প্রিন্ট করল।

$x=$x-- - $x--;

এখানেও আবার সেই আগের মত কাজ হবে। প্রথম $x এর মান হিসেবে পাওয়া গেল 11। তারপর $x এর মান 1 কমে হল 10 - এর পরের $x-- এর জন্য $x এর মান পাওয়া গেল 10। অর্থাৎ সমীকরনটা দাড়ায়

$x=11-10=1
echo $x."</br>";

এখানে 1 প্রিন্ট করল।

permanent link

answered 03 Feb '15, 07:32

mabdsalam12's gravatar image

mabdsalam12
453113

2

@mabdsalam12 : ব্যাখ্যাটা সঠিক নয়, এক্ষেত্রে মতামতের কোনো গুরুত্ব নাই। কেন সেটা আমি আরেকটা উত্তরে বিস্তারিত লিখলাম।

(03 Feb '15, 08:08) Tamim Shahriar Subeen ♦♦

কষ্ট করার জন্য ধন্যবাদ ...... @mabdsalam12

(03 Feb '15, 20:31) Shipu
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×326
×102
×70
×40
×26

question asked: 02 Feb '15, 19:52

question was seen: 1,833 times

last updated: 26 May '15, 16:12