ما هو الفرق في استخدام && و || في فعله أثناء الحلقة ؟

StackOverflow https://stackoverflow.com/questions/647413

  •  22-07-2019
  •  | 
  •  

سؤال

#include<iostream>
using namespace std;

int main()
{

    char again;
    do
    {
        cout<<"you are in the while loop";
        cout<<"do you want to continue looping?";
        cin>>again;
    } while (again != 'n' || again != 'N');

    system("pause");
    return 0;
}

أعرف أن هناك شيء خاطئ مع اختبار الشرط في 'الوقت'.ولكن أنا لا يمكن أن الرقم بها.

عند إدخال المستخدم لا 'n' ولا 'N', حلقة يجب أن تبقي على طباعة رمز "كنت في حلقة من الوقت".مرة واحدة 'n' أو 'ن' الضغط ، سيتم إنهاء البرنامج.

ومع ذلك بالنسبة لي رمز البرنامج سوف تبقى على حلقات رمز بغض النظر ما حرف أدخل.ولكن عندما أقوم بتغيير '||' إلى '&&', البرنامج يمكن أن ركض على النحو المطلوب.أي شخص يمكن أن تخبرني ما الذي يجري ؟

هل كانت مفيدة؟

المحلول

هذا هو مشترك منطقية السؤال. || يعني "أو" التي تعني "طالما جانب واحد من هذا صحيحا ، ثم التعبير هو الصحيح." وذلك عندما تمر الأحرف الكبيرة 'N' إلى c != 'n' || c != 'N' البرنامج يقول "حسنا ، 'N' لا يساوي 'n', ولذلك جانب واحد من التعبير صحيح, ولذلك كله التعبير صحيحا وليس هناك حاجة للتحقق من بقية التعبير". حتى عندما كنت اضغط صغيرة 'n', البرنامج يقول "حسنا ، 'n' يساوي 'n', لكنه لا يساوي 'N', ولذلك جانب واحد من التعبير صحيح, ولذلك كله التعبير هو الصحيح." هذا هو ما يحدث في أثناء الحلقة.

من ناحية أخرى ، && يعني "و" مما يعني أن "كلا الجانبين من التعبير يجب أن يكون صحيح" ؛ عند تمرير الأحرف الكبيرة 'N' إلى c != 'n' && c != 'N' البرنامج يفكر "'N' لا يساوي 'n', لكنه يساوي 'N', ولذلك جانب واحد فقط من التعبير صحيح, وبالتالي فإن التعبير كاذبة".

هذا محير لأنه إذا كنت اختبار لمعرفة ما إذا كانت حرفا كانت تساوي قيم معينة يمكنك استخدام || (مثلا: "أريد أن أعرف إذا كان 'a' أو 'b' أو 'c' تم إدخال").

في الأساس, عندما كنت استخدام || من أجل التعبير, و تريد عكس ذلك التعبير ثم كنت بحاجة إلى تغيير && (على سبيل المثال ، لا أريد شيئا من 'a', 'b' أو 'c';أو بعبارة أخرى ، لا يمكن أن تكون القيمة 'a' و فإنه لا يمكن أن يكون 'b', و فإنه لا يمكن أن يكون 'c'").وبالمثل ، إذا كنت تستخدم && من أجل التعبير, و تريد عكس ذلك التعبير فأنت بحاجة إلى استخدام ||.هذا هو واحد من دي مورغان القوانين التي أنصحك بأن تقرأ على ذلك يمكنك تجنب الحاجة إلى إعادة اكتشاف كل واحد منهم على الخاص.

نصائح أخرى

ونعم: || و"أو" و&& هو "و".

كل الحرف هو إما "لا" ن "أو" لا "N" لأنه لا يمكن أن يكون <م> على حد سواء ' ن 'و' N 'في وقت واحد.

وآخر (ربما أبسط لقراءة) طريقة كتابة الشرط ستكون كما يلي:

!(again == 'n' || again == 'N')

والذي يعني "عكس (مرة أخرى هي <م> إما 'ن' أو 'N')".

ومن الجبر منطقية تسمى "قوانين دي مورغان ".

Not (P And Q) = (Not P) Or (Not Q)
Not (P Or Q) = (Not P) And (Not Q)

في قضيتك، وتريد المستخدمين عدم دخول 'n' أو 'N'، ويمكن ترجمتها في هذا المنطق.

!(again == 'n' || again == 'N')

عند تطبيق قوانين دي مورغان، سيكون

(again != 'n' && again != 'N')

لمزيد من المعلومات، قد ترغب في قراءة المنطق الإقتراحي

وعلى الرغم من أن الملصق الأصلي هو سعيد الآن، وأنا لم أر هذا في إجابات أخرى:

(true  && true ) == true
(true  && false) == false
(false && true ) == false
(false && false) == false

(true  || true ) == true
(true  || false) == true
(false || true ) == true
(false || false) == false

!true  == false
!false == true

وهذا كل شيء!

وأنا أفهم مشكلتك بشكل جيد، وهنا هو التفسير:

وحلقة افعل بينما هي حلقة خروج الشرط. وهذا يعني أن الجسم من الحلقة هو دائما تنفيذها أولا. ثم، يتم تقييم حالة الاختبار. إذا كان الشرط اختبار صحيح، البرنامج ينفذ الجسم من الحلقة مرة أخرى. إذا كان الشرط اختبار غير صحيح، الحلقة تنتهي ويستمر تنفيذ البرنامج مع العبارة التالية حين.

في التعليمات البرمجية، عند press'n "or'N، حالة اختبار الخاص بك وسوف يكون دائما واحد صحيح والباطل، وذلك عندما تستخدم || سوف تلبية شرط اختبار (صحيح || كاذبة = صحيح)، وبالتالي فإن برنامج تنفيذ جسم الحلقة مرة أخرى. ولكن عند استخدام &&، هذه الإرادة يعطي (صحيح && كاذبة كاذبة =)، لا يتم statisfied حالة اختبار بعد الآن، وبالتالي فإن البرنامج يتم تنفيذ جسم الحلقة مرة أخرى.

وآمل أن من المفيد ..... التمتع برمجة! Ameraradi

و&& غير منطقية AND. || هو منطقي OR.

و(أيضا، وهو أحادي المعامل AND، و| غير أحادي المعامل OR)

وكنت قد ترغب في محاولة بينما (! (مرة أخرى == 'ن' || مرة أخرى == 'N'))

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top