• 0
khaled_prg

لغز محير في لغة السي ...!

سؤال

السلام عليكم

اليوم جئتكم بسؤال محير يتعلق بعملية الـ casting , انظر الكود:

#include<stdio.h>
#include<conio.h>
int main()
{
printf("%d \n",(float)3/5);
getche();
return 0;
}

عند تنفيذ الكود يظهر الرقم التالي:

1073741824

من أين أتى هذا الرقم ...!؟

من يجيب على السؤال عنده 5 نقاط :wink:

في انتظار إبداعاتكم :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

22 إجابة على هذا السؤال .

  • 0

عزيزي الكود خاطئ, و ينتج عنه Undefined Behavior.

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

عزيزي الكود خاطئ, و ينتج عنه Undefined Behavior.

يا ريت توضح اكثر :blush:

بانتظارك :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
getche();

ما فائدة هذة الدالة اخى الكريم :wacko:

انت لم تستخدمها اطلاقا

كما انها تقوم بارجاع قيمة int و انت لم تقم بحفظ هذة القيمة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ما فائدة هذة الدالة اخى الكريم

في الحقيقة فإن هذه الدالة تقرأ حرف من المستخدم و لكنني استخدمتها هنا لتعمل مثل الدالة system في لغة السي++ .. يعني توقف الشاشة حتى نشاهد المُخرجات.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخى انت تقوم بطباعة قيمة float بformat لint

لا يمكن تتوقع ان تكون النتيجة صحيحة ,فfloat تخزن بطريقة فى الذاكرة و int تخزن بطريقة مختلفة تماما . اى ستقوم الدالة بالعمل بطريقة عشوائية لانك ارشدتها خطاء .

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

اخى انت تقوم بطباعة قيمة float بformat لint

لا يمكن تتوقع ان تكون النتيجة صحيحة ,فfloat تخزن بطريقة فى الذاكرة و int تخزن بطريقة مختلفة تماما. اى ستقوم الدالة بالعمل بطريقة عشوائية لانك ارشدتها خطاء .

ماذا تقصد بالجزء ذو اللون الأحمر !؟

أرجو التوضيح.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بص يا أخي, انا أيضا كنت مرتبك في فهمها,, لكن إعتبر نفسك أنت من تكتب كود الدالة printf ,,, فأنت تطلب من المستخدم إذا إستخدم %d أن يلحقها ب int و ليس float , فهو إن ألحقها ب float فهذا هو خطئه ,, و أنت كمبرمج للدالة لست مسؤل عنه...

أما كيفية تعامل الدالة printf مع ال float هنا, فلا أدري, ربما تقوم بعمل truncate لل bytes الزائده أو شئ من هذا القبيل, لكن على كلٍ النتائج لن تكون مضبوطه...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انت تعرف ان stdout و stdin ماهما الfile-like وهناك عدة طرق للكتابة والقراء منها الtext ومنها الbinary (كما توجد البيانات فى الذاكرة)

انت الان تكتب formatted text و تقوم بعمل insert لرقم int ,ماذا يجب ان تقوم بة printf ؟ ستذهب الى argument متوقعة انة int لتقوم لتحويلة لtext يعبر عن الint .

لا اعرف الimmplemtion الخاص بprintf ولكن باعتقادى انة سياخذ عنوان المتغير وسيقوم بتحويل الbinary data بحجم الint (فلنقل 4 بايت) التى فى الذاكرة الى تعبير text عن int .

ماذا تتوقع من تحويل 4 بايت من بيانات float لint ؟

هذا حسب اعتقادى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

أشكركم على المساعدة :)

يا ريت لو يشرح لي أحدكم الـ Undefined Behavior بشكل مبسط.

تحياتي.

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

قم باستبدال d% بـ f%

بالنسبة للرقم فهو موجود في مكان ما في جهازك :P

وبالتوفيق

______________________________________________

اخى انت تقوم بطباعة قيمة float بformat لint

لا يمكن تتوقع ان تكون النتيجة صحيحة ,فfloat تخزن بطريقة فى الذاكرة و int تخزن بطريقة مختلفة تماما . اى ستقوم الدالة بالعمل بطريقة عشوائية لانك ارشدتها خطاء

لست متمكنا من لغة السي ولكن الأخ لم يقم بحجز شيء في الذاكرة . ماعمله الأخ يمكن تسميته بـ Immediate math / Value .

تم تعديل بواسطه nice guy
-1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخى انت تقوم بطباعة قيمة float بformat لint

لا يمكن تتوقع ان تكون النتيجة صحيحة ,فfloat تخزن بطريقة فى الذاكرة و int تخزن بطريقة مختلفة تماما . اى ستقوم الدالة بالعمل بطريقة عشوائية لانك ارشدتها خطاء .

كلام سليم تماماً ولكن ليس بصوره عشوائيه .

ان ال float يمثل داخل الحاسوب بما يسمى floating point representation وبأختصار فانه يختلف عت تمثيل ال int بأنه يكتب رقم ثم يضربه ب 10^ (يمكنك البحث بالموضوع للاستزاده) وبتالي فانك تقراء الرقم على انه int او decimal بالاصح فستضهر نتيجه القارئه على انه decimal

#include <stdio.h> 
#include <stdlib.h>
int main() {
printf("%f \n",(int)5/2);
return 0;
}

هنا ستضهر النتيجه صفر بدلاً من 2 ولنفس السبب اننا نقراء decimal على انه float

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يا ريت لو تقتصر الردود على شرح الـ Undefined Behavior لأنه يمثل أساس المشكلة.

بانتظاركم :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
يا ريت لو تقتصر الردود على شرح الـ Undefined Behavior لأنه يمثل أساس المشكلة.

من c draft standard من صفحة 545 الى 558 ستجد حالات ال Undefined Behavior .

وتعريفة من نفس الورق

1 undefined behavior

behavior, upon use of a nonportable or erroneous program construct or of erroneous data,

for which this International Standard imposes no requirements

2 NOTE Possible undefined behavior ranges from ignoring the situation completely with unpredictable

results, to behaving during translation or program execution in a documented manner characteristic of the

environment (with or without the issuance of a diagnostic message), to terminating a translation or

execution (with the issuance of a diagnostic message).

3 EXAMPLE

An example of undefined behavior is the behavior on integer overflow

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

1 undefined behavior

behavior, upon use of a nonportable or erroneous program construct or of erroneous data,

for which this International Standard imposes no requirements

2 NOTE Possible undefined behavior ranges from ignoring the situation completely with unpredictable

results, to behaving during translation or program execution in a documented manner characteristic of the

environment (with or without the issuance of a diagnostic message), to terminating a translation or

execution (with the issuance of a diagnostic message).

3 EXAMPLE

An example of undefined behavior is the behavior on integer overflow

يا ريت لو تترجم الفقرة إلى العربية لأنني لا أعرف الإنجليزية :blush:

بانتظارك.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلوك الغير معروف : هو سلوك ينشى من بنية غير محمولة او خاطئة للبرنامج ,او بيانات خاطئة . ,وهى لم تحدد لها الstandard اى متطلبات (اى ليس لها سلوك مقرر) .

2-السلوك الغير معروف يتدرج من التجاهل التام ونتائج غير متوقعة الى العمل بشكل مرتب حسب البيئة التى يعمل عليها (اى انة قد يعمل بشكل معين بالاعتماد على سلوب البيئة التى يعمل عليها) وقد ينتهى مع رسائل خطاء(او تحذير) او لا diagnostic .

3-احد الامثلة هية int overflow

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
السلوك الغير معروف : هو سلوك ينشى من بنية غير محمولة او خاطئة للبرنامج ,او بيانات خاطئة . ,وهى لم تحدد لها الstandard اى متطلبات (اى ليس لها سلوك مقرر) .

2-السلوك الغير معروف يتدرج من التجاهل التام ونتائج غير متوقعة الى العمل بشكل مرتب حسب البيئة التى يعمل عليها (اى انة قد يعمل بشكل معين بالاعتماد على سلوب البيئة التى يعمل عليها) وقد ينتهى مع رسائل خطاء(او تحذير) او لا

ترجمة غريبة بعض الشيء !!! لم أفهمها جيدا ...!

أرجو التوضيح أكثر و تكون الترجمة دقيقة ومتجانسة :blush:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يا ريت لو يشرح لي أحدكم الـ Undefined Behavior بشكل مبسط.

أخي أنصحك بأن يكون لديك صبر في تعلم البرمجة. لا تقفز من موضوع إلى موضوع هكذا.

ببساطة, الـ Undefined Behavior هو تصرف غير مسؤولة عنه الدالة التي تناديها أو الشيء (Construct) الذي تقوم باستعماله في اللغة. مثلاً, من المعروف أن القسمة على صفر خطأ منطقي. في لغات أخرى, يكون هناك ما يسمى بالـ Exception في اللغة اسمه Divide by Zero أو ما شابه, ليخبرك أنك قسمت على صفر. في C و ++C هناك شروط يجب أن تتوفر قبل عمل أي دالة بشكل صحيح. تسمى أحياناً الـ Preconditions. ببساطة أكثر, صاحب الدالة التي سوف تستعملها يقول لك يجب أن تنادي الدالة بالطريقة التالية, و إن لم تناديها بالطريقة المعطاة فإن الدالة ليست مسؤولة عن التحقق من صحة ما يمرر لها. بالتالي صاحب الدالة لا يقوم بالتحقق من شيء, و إنما يفترض أنك أنت المسؤول عن المناداة بشكل صحيح. و أنت قمت بمناداة الدالة printf بشكل خاطئ. هذا هو الـ Undefined Behavior بكل بساطة. و لا يمكنك بأي حال من الأحوال أن تقول ظهرت لي نتيجة ما عند تجربة الكود, إذاً فهو صحيح. لأن الدالة نفسها لا تتحقق أصلاً من شيء. بالتالي الناتج خاطئ حتى لو كان صحيحاً على مترجم معين بنسخة معينة على نظام تشغيل معين باستخدام مكتبات معينة و جميع الظروف التي تحيط لحظة تشغيل الكود!

تحياتي...

4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ببساطة, الـ Undefined Behavior هو تصرف غير مسؤولة عنه الدالة التي تناديها أو الشيء (Construct) الذي تقوم باستعماله في اللغة. مثلاً, من المعروف أن القسمة على صفر خطأ منطقي. في لغات أخرى, يكون هناك ما يسمى بالـ Exception في اللغة اسمه Divide by Zero أو ما شابه, ليخبرك أنك قسمت على صفر. في C و ++C هناك شروط يجب أن تتوفر قبل عمل أي دالة بشكل صحيح. تسمى أحياناً الـ Preconditions. ببساطة أكثر, صاحب الدالة التي سوف تستعملها يقول لك يجب أن تنادي الدالة بالطريقة التالية, و إن لم تناديها بالطريقة المعطاة فإن الدالة ليست مسؤولة عن التحقق من صحة ما يمرر لها. بالتالي صاحب الدالة لا يقوم بالتحقق من شيء, و إنما يفترض أنك أنت المسؤول عن المناداة بشكل صحيح. و أنت قمت بمناداة الدالة printf بشكل خاطئ. هذا هو الـ Undefined Behavior بكل بساطة. و لا يمكنك بأي حال من الأحوال أن تقول ظهرت لي نتيجة ما عند تجربة الكود, إذاً فهو صحيح. لأن الدالة نفسها لا تتحقق أصلاً من شيء. بالتالي الناتج خاطئ حتى لو كان صحيحاً على مترجم معين بنسخة معينة على نظام تشغيل معين باستخدام مكتبات معينة و جميع الظروف التي تحيط لحظة تشغيل الكود!

الآن اتضحت الصورة :)

شكرا لك.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
أخي أنصحك بأن يكون لديك صبر في تعلم البرمجة. لا تقفز من موضوع إلى موضوع هكذا.
+1
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
أخي أنصحك بأن يكون لديك صبر في تعلم البرمجة. لا تقفز من موضوع إلى موضوع هكذا.

ماذا تقصد !؟ :blink:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ال undifined behavior يدل على ان عملية معينة تعطي نتيجة عشوائية لا يمكننا الحكم عليها هل هي صحيحة ام لا لأن طريقة اشتغالها و سلوكها غير معروف.

يمكن تشبيهها بالشكل الغير المحدد في الرياضيات مثلا القسمة °°+/°°+.(°° = رمز اللانهاية).

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ال undifined behavior يدل على ان عملية معينة تعطي نتيجة عشوائية لا يمكننا الحكم عليها هل هي صحيحة ام لا لأن طريقة اشتغالها و سلوكها غير معروف.

يمكن تشبيهها بالشكل الغير المحدد في الرياضيات مثلا القسمة °°+/°°+.(°° = رمز اللانهاية).

جميل جدا .. اتضحت الفكرة أكثر :)

جزاك الله خيرا.

سلامي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .