الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه khaled_prg في 18 يوليو 2010 · 22 رد · 1,403 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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

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

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

1073741824

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

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

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

#2

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

2
#4
اقتباس
getche();

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

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

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

00020309t.gif

1958_1963.gif
#5

السلام عليكم

اقتباس
ما فائدة هذة الدالة اخى الكريم

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

#6

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

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

2 −1

name : mohamedyosry

#7

السلام عليكم

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

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

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

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

#8

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

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

#9

انت تعرف ان 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 ؟

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

name : mohamedyosry

#10

السلام عليكم

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

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

تحياتي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 19 يوليو 2010 في 03:28

#11

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

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

وبالتوفيق

______________________________________________

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

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

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

تم تعديل هذه المشاركة بواسطة nice guy في 19 يوليو 2010 في 07:56

−1
#12
apex كتب:

اخى انت تقوم بطباعة قيمة 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

#14
اقتباس
يا ريت لو تقتصر الردود على شرح الـ 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

name : mohamedyosry

#15

السلام عليكم

اقتباس

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:

بانتظارك.

#16

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

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

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

name : mohamedyosry

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

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

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

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

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

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

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

تحياتي...

4
#19

السلام عليكم

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

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

شكرا لك.

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

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

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

#23

السلام عليكم

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

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

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

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

سلامي.

مواضيع مشابهة