سؤال

& وقد &&. | وقد ||.لماذا لا ^ لديك ^^?

وأنا أفهم أنه لن تكون الدائرة قصيرة ، ولكنه كان قد دلالات مختلفة.في C ، true هو حقا أي قيمة غير الصفر.المعامل XOR ليست دائما نفس الشيء المنطقية XOR:

int a=strcmp(str1,str2);// evaluates to 1, which is "true"
int b=strcmp(str1,str3);// evaluates to 2, which is also "true"
int c=a ^^ b; // this would be false, since true ^ true = false
int d=a ^ b; //oops, this is true again, it is 3 (^ is bitwise)

بما أنه لا يمكنك دائما الاعتماد على القيمة الحقيقية يجري 1 أو -1, ألا وهو ^^ مشغل تكون جدا مفيدة ؟ أنا في كثير من الأحيان إلى فعل أشياء غريبة مثل هذا:

if(!!a ^ !!b) // looks strange
هل كانت مفيدة؟

المحلول

<وأ href = "https://web.archive.org/web/20100213061432/http://www.it.usyd.edu.au/~dasymond/mirror/c-faq/misc/xor.dmr هتمل "يختلط =" نوفولو noreferrer "> دينيس ريتشي يجيب

<اقتباس فقرة>   

وهناك على حد سواء أسباب تاريخية وعملية لماذا لا يوجد مشغل ^^.

     

ووعملي هو: ليس هناك فائدة كبيرة للمشغل. والنقطة الرئيسية في && و|| للاستفادة من تقييم ماس كهربائى، ليس فقط لأسباب تتعلق بالكفاءة، ولكن في كثير من الأحيان عن التعبير وصحة.
  [...]
  على النقيض من ذلك، فإن وجود مشغل ^^ يجبر دائما تقييم ذراعيه للتعبير، لذلك ليس هناك مكاسب الكفاءة. وعلاوة على ذلك، الحالات التي تسمى ^^ حقا نادرة جدا، على الرغم من يمكن أن تنشأ الأمثلة. هذه الحالات نادرة الحصول واغرب كما كنت كومة من operator--

if (cond1() ^^ cond2() ^^ cond3() ^^ ...) ...
     

ولا يترتب على ذلك متى بالضبط عدد فردي من condx()s صحيحة. على النقيض من ذلك، لا تزال && و|| النظير معقولة إلى حد ما ومفيدة.

نصائح أخرى

ومن الناحية الفنية، واحد موجود بالفعل:

a != b

ولأن هذا سوف تقييم إلى true إذا كانت قيمة حقيقة المعاملات تختلف.

تحرير:

VOLTE الصورة تعليق:

(!a) != (!b)

وهو الصحيح لأن جوابي أعلاه لا يعمل لأنواع int. I سيتم حذف الألغام إذا يضيف جوابه.

تحرير مرة أخرى:

وربما أنا نسيان شيء من C ++، ولكن كلما أفكر في ذلك، وأكثر وأنا أتساءل لماذا كنت من أي وقت مضى إرسال if (1 ^ 2) في المقام الأول. الغرض ^ هو الحصري أو رقمين معا (والذي يقيم إلى رقم آخر)، وليس تحويلها إلى قيم منطقية ومقارنة القيم حقيقتها.

وهذا يبدو أنه سيكون افتراض غريب عن مصمم لجعل لغة.

غيرbool المعاملات, أعتقد أن ما كنت أريد a ^^ b ليتم تقييمها:

(a != 0) ^ (b != 0)

حسنا, لديك الخيار أعلاه و لديك عدد قليل من الخيارات المدرجة في إجابات أخرى.

المشغل ^^ ستكون زائدة عن bool المعاملات.نتحدث فقط عن منطقية المعاملات, جدلا, دعونا نتظاهر بأن ^ كان أحادي المعامل-فقط ، ^^ موجودة كما المنطقية XOR.ثم لديك هذه الخيارات:

  • & - AND-دائما يقيم كل المعاملات
  • && - منطقيا-لا دائما تقييم كل المعاملات
  • | - المعامل أو -- دائما يقيم كل المعاملات
  • || - منطقية أو لا دائما تقييم كل المعاملات
  • ^ - المعامل XOR -- يجب دائما تقييم كل المعاملات
  • ^^ - المنطقية XOR -- يجب دائما تقييم كل المعاملات

لماذا لم تخلق ^^ أساسا تحويل القيم العددية في bools وبعد ذلك بمثابة ^?هذا سؤال جيد.ربما لأنه أكثر يحتمل أن تكون مربكة من && و ||, ربما لأنه يمكنك بسهولة إنشاء أي ما يعادل ^^ مع المشغلين الآخرين.

لا أستطيع أن أقول ما كان في رؤوس كيرنيغان وريتشي عندما اخترعوا C، ولكن قمت بعمل إشارة موجزة ل"لن تكون قصيرة في الدائرة"، وانا التخمين وهذا هو السبب: انها ليست ممكن لتنفيذ ذلك باستمرار. لا يمكنك دائرة قصر XOR مثل يمكنك AND و OR، حتى ^^ لا يمكن موازية تماما && و ||. وبالتالي فإن الكتاب قد يكون قد قرر أن يجعل عملية التي تبدو نوعا من نوع من مثل بالتوازي تجاه الآخرين ولكن ليس تماما سيكون أسوأ من عدم وجود على الإطلاق.

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

والحل آخر لتلك التي نشرت أعلاه (حتى لو كان يتطلب فرع آخر في التعليمات البرمجية) ستكون كما يلي:

if ( (a? !b : b ) )

وهذا ما يعادل XOR.

في جاوة المشغل ^ لا بل تفعل XOR المنطقي عند استخدامها على اثنين من المعاملات المنطقية (تماما مثل & و| في جاوة تفعل غير قصيرة في الدائرة المنطقية AND و OR، على التوالي، عندما يطبق على القيم المنطقية). والفرق الرئيسي مع C / C ++ هو أن C / C ++ يسمح لك لخلط الأعداد الصحيحة والقيم المنطقية، في حين أن جافا لا.

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

وثمة سؤال مماثل سيكون لنسأل، كيف يمكنك أن تفعل غير قصيرة في الدائرة المنطقية AND و OR في C / C ++؟ الجواب المعتاد هو استخدام مشغلي & و| على التوالي. ولكن مرة أخرى، وهذا يعتمد على القيم يجري bool أو إما 0 أو 1. إذا كنت تسمح لأية قيم صحيحا، فإن هذا لا يعمل سواء.

وبغض النظر عن حالة صالح أو ضد ^^ كمشغل، كنت سبيل المثال مع تمتص strcmp(). فإنه لا يرجع قيمة الحقيقة (صحيحة أو خاطئة)، فإنه يعود وجود علاقة بين مدخلاته، المشفرة كعدد.

وبالتأكيد، يمكن تفسير أي عدد صحيح كقيمة الحقيقة في C، وفي هذه الحالة 0 هي "كاذبة" وجميع القيم الأخرى هي "صحيح"، ولكن هذا هو عكس ما strcmp() العوائد.

والمثال الخاص بك ينبغي أن تبدأ:

int a = strcmp(str1, str2) == 0; // evaluates to 0, which is "false"
int b = strcmp(str1, str3) == 0; // evaluates to 0, which is also "false"

ويجب مقارنة قيمة الإرجاع مع 0 لتحويلها إلى قيمة منطقية سليمة مبينا إذا كانت السلاسل متساوية أم لا.

ومع القيم المنطقية "المناسبة"، ممثلة بشكل قانوني ك 0 أو 1، المشغل المختصة بالبت ^ يعمل بشكل أفضل كثيرا، جدا ...

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