سلام
میشه برای من توضیح بدین چرا جواب عبارت زیر وقتی کامپایل میکنم 5 میشه از نظر من جواب باید 9 باشه .
من با tcc کامپایل کردم
کد:int a=6, b=2 ,c=1, d=12;
if (c++)
d=a++*b/c*b++-++c ;
cout<<d;
Printable View
سلام
میشه برای من توضیح بدین چرا جواب عبارت زیر وقتی کامپایل میکنم 5 میشه از نظر من جواب باید 9 باشه .
من با tcc کامپایل کردم
کد:int a=6, b=2 ,c=1, d=12;
if (c++)
d=a++*b/c*b++-++c ;
cout<<d;
چه سوالی پرسیدید بسیار بسیار عجیب هست!!! بنظر من هم باید 9 بیادنقل قول:
و اگر در بورلند و VS عبارت به همان صورتی که دوستمون نوشته, نوشته بشه جواب 5 و اگر بصورت زیر نوشته بشه 9 میاد!!!!
و اگه خودمون هم بخوایم مقدار عددی بصورت پایین بدیم جواب 9 می شه!!کد:int a=6, b=2 ,c=1, d=12;
if (c++)
{
d=a*b/c*b ;
d =d - ++c ;
}
cout<<d;
d=6*2/2*2-3;
دقیقا دوستمون درست میگه
تمام مشکل سر c ++ آخریست یعنی اگه به جا ++c , c بزاریم جواب میشه 11
ولی ++c میزارم باز میشه 9
جدا هم بنویسیم درست میشه
حالا چرا این جوری میشه!!!!!!!
جواب این موضوع رو با معرفی اپراتور تک اپرتندی پلاس پلاس شروع میکنم.
این دستور شامل دو بخش می شه
preincrement: ++x
این دستور قبل از آغاز عملیات در سطر متغیر را یک واحد اضافه کرده و سپس عملیات رو انجام می ده و حاصل رو اساین می کنه
در واقع در سوال شما در خط سوم ابتدا مقدار سی برابر 3 قرار داده می شه و بعد حاصل عبارت حساب میشه. اگر شما در یک خط از یک متغیر چند بار استفاده کنید و یکی از انها را به این شکل پلاس پلاس کنید در نهایت تغییر در همه جا اعمال می شه.
++postincrement: x
این عملگر پس از انجام محاسبات و پایان سطر بازگشته و مقدار متغیر رو یکی زیاد می کنه. و به خط بعد می ره.
دلیل تفاوت بین دو کدی که مهران عزیز هم کامپایل کرده مشخص شد...
عجب چیز مسخره ای مگر همچین چیزی ممکن هست؟ دو کدی که در c# و c++ نوشته شدند - c# عبارت 9 و c++ عبارت 5 رو نتیجه می ده!!!
(if رو برداشتم که در c# هم کامپایل شه ولی در اصل موضوع هیچ فرقی نداره)
کد در c#
کد در c++کد:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace az
{
class Program
{
static void Main(string[] args)
{
int a = 6, b = 2, c = 1, d = 12;
c++;
d = a++ * b / c * b++ - ++c;
Console.WriteLine(d);
}
}
}
کد:#include<iostream>
#include<conio.h>
int main()
{
int a = 6, b = 2, c = 1, d = 12;
c++;
d = a++ * b / c * b++ - ++c;
cout<<d;
getch();
return 0;
}
كامپايلر من مقدار 9 رو چاپ مي كنه(microsoft visual c++6)
اون 2 تا كامپايلر(سي شارپ و خودم) مال يه شركت معتبر هستن(مايكروسافت) ولي اون نه!
Microsoft Visual Studio 2008 هم مقدار 5 رو چاپ می کنهنقل قول:
به هر حال باگی هستش که پیدا شده و کاریش هم نمی شه کرد
فعلا
میشه بیشتر توضیح بدین؟!
من دقیق نگرفتم چی شد :41:
عبارت ما به خاطر اینکه c++ آخرش داره از سمت راست محاسبه میشه؟
اگه c خالی بود یا ++c از چپ شروع میشد
مرسی
اما به نظر من هنوز هم این موضوع باگ و مشکل نیست اگه توضیحی که دادم بخونی متوجه می شی. در خطی که عبارات نوشته شده قبل از انجام هر محاسبه ای مقدار سی برابر 3 قرار داده می شه و بعد سایر محاسبات انجام می شه.توی کامپایلر های غیرمعتبر هر جا ++ باشه با +1 عوض می شه و دلیل این اشکال هم همینه ...
البته اضافه می کنم که با اپراتور ++ توی سی شارپ اشنایی ندارم اما توی سی پلاس پلاس این طوره
مثل اینکه دیشب p30 قاطی کرده بود من اصلا پستهای جناب humphry و star462 رو ندیده بودم و مثل این بود که 2 تا پست پشت سر هم زده باشم - با تشکر از humphry جان الان متوجه شدم که چطور حساب می شه
در واقع کامپایلر کد رو به این صورت تبدیل می کنه
که بعد از postfix شدن بصورت پایین می شه و جواب بدست میاد و محاسبه می کنه (ولی باز هم از نظر من اشتباهه و مال c# درست تره)کد:6*2/3*2-3
کد:62*3/2*3-
منم گرفتم چی شد!!!:20:
خب بالاخره اگه نواقصی نبود که دولوپی هم در کار نبود