operators - ما هو عامل التشغيل "->" في C++؟




code-formatting standards-compliance (18)

بعد قراءة الميزات المخفية والزوايا المظلمة لـ C ++ / STL على comp.lang.c++.moderated للدهشة تمامًا لأن المقتطف التالي تم تجميعه وعمله في كل من Visual Studio 2008 و G ++ 4.4.

هنا الرمز:

#include <stdio.h>
int main()
{
    int x = 10;
    while (x --> 0) // x goes to 0
    {
        printf("%d ", x);
    }
}

أفترض أن هذا هو C ، لأنه يعمل في دول مجلس التعاون الخليجي كذلك. أين يتم تحديد هذا في المعيار ، ومن أين أتت؟


Answers

انتبه

--> ليست مشغل. هو في الواقع اثنين من المشغلين المنفصلين ، -- و > .

رمز الشرطية decrements x ، أثناء إرجاع قيمة x الأصلية (غير decremented) ، ثم يقارن القيمة الأصلية مع 0 باستخدام العامل > .

لفهم أفضل ، يمكن كتابة البيان على النحو التالي:

while((x--) > 0)

هذا مشغل معقد جدًا ، لذا قام ISO / IEC JTC1 (اللجنة الفنية المشتركة 1) بوضع الوصف في جزأين مختلفين من معيار C ++.

وإذا وضعنا المزاح جانباً ، فهما مشغلان مختلفان: -- و > موصوفين على التوالي في الفقرة 2.2.2.6 / 2 و §9.9 من معيار C ++ 03.


هناك مسافة مفقودة بين -- و > . x آخر decremented ، أي ، decremented بعد التحقق من حالة x>0 ? .


تطيع C و C++ القاعدة "أقصى حدش". بنفس الطريقة يتم ترجمة b --- إلى (a--) - b ، في حالتك x-->0 يترجم إلى (x--)>0 .

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


يمكن أن يصل إلى الصفر بشكل أسرع في الاتجاه المعاكس:

int x = 10;

while( 0 <---- x )
{
   printf("%d ", x);
}

8 6 4 2

يمكنك التحكم في السرعة مع سهم!

int x = 100;

while( 0 <-------------------- x )
{
   printf("%d ", x);
}

90 80 70 60 50 40 30 20 10

؛)


سوف يطبع المترجم الخاص بي 9876543210 عندما أقوم بتشغيل هذا الكود.

#include <iostream>
int main()
{
    int x = 10;

    while( x --> 0 ) // x goes to 0
    {
        std::cout << x;
    }
}

كما هو متوقع. while( x > 0) تعني في الواقع while( x > 0) . x - x-- آخر x .

while( x > 0 ) 
{
    x--;
    std::cout << x;
}

هي طريقة مختلفة لكتابة نفس الشيء.

من الجميل أن تبدو الأصلي مثل "بينما x يذهب إلى 0" رغم ذلك.


كتاب واحد قرأته (لا أتذكر بشكل صحيح أي كتاب) ذكر: يحاول Compilers تحليل التعبيرات إلى الرمز المميز الأكبر باستخدام القاعدة اليمنى اليسرى.

في هذه الحالة ، التعبير:

x-->0

يوزع على أكبر الرموز:

token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0

تنطبق القاعدة نفسها على هذا التعبير:

a-----b

بعد التحليل:

token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b

آمل أن يساعد هذا على فهم تعبير معقد ^^


الطريقة التقليدية التي نحدد بها الحالة في حين أن قوس العروة " () " وإنهاء الشرط داخل الأقواس " {} " ، لكن هذا -- & > هي طريقة يحددها المرء على الفور. على سبيل المثال:

int abc(){
    int a = 5
    while((a--) > 0){ // Decrement and comparison both at once
        // Code
    }
}

تقول ، decrement a و تشغيل الحلقة حتى الوقت أكبر من 0

طريقة أخرى كان يجب أن تكون مثل:

int abc(){
    int a = 5
    while(a > 0){
        // Code
        a = a -1 // Decrement inside loop
    }
}

في كلا الاتجاهين ، نفعل نفس الشيء ونحقق نفس الأهداف.


استخدام --> له صلة تاريخية. تم decrementing (ولا يزال في بعض الحالات) ، أسرع من زيادة على هندسة x 86. استخدام --> يشير إلى أن x سيذهب إلى 0 ، ويناشد أولئك الذين لديهم خلفيات رياضية.


على أي حال ، لدينا "يذهب إلى" المشغل الآن. "-->" من السهل تذكرها كإتجاه ، و "بينما x يذهب إلى الصفر" هو معنى مستقيم.

علاوة على ذلك ، هو أكثر فعالية قليلاً من "for (x = 10; x > 0; x --)" على بعض الأنظمة الأساسية.


while( x-- > 0 )

كيف يتم تحليل ذلك.


يقارن هذا الرمز أولاً x و 0 ثم decrements x. (كما يقال في الإجابة الأولى: أنت في مرحلة ما بعد decrementing x ثم مقارنة x و 0 مع > مشغل.) انظر مخرجات هذا الكود:

9 8 7 6 5 4 3 2 1 0

نحن الآن أولا مقارنة ثم تناقص من خلال رؤية 0 في الإخراج.

إذا أردنا أن ننقص أولاً ثم قارن ، استخدم هذا الرمز:

#include <stdio.h>
int main(void)
{
    int x = 10;

    while( --x> 0 ) // x goes to 0
    {
        printf("%d ", x);
    }
    return 0;
}

هذا الناتج هو:

9 8 7 6 5 4 3 2 1

انها

#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d ", x);
     }

     return 0;
}

مجرد الفضاء يجعل الأشياء تبدو مضحكة ، -- decrements و > يقارن.


انها تعادل

while (x-- > 0)

x-- (decrement post) يكافئ x = x-1 ، لذلك يتحول الرمز إلى:

while(x > 0) {
    x = x-1;
    // logic
}

مهووس تمامًا ، لكنني سأستخدم هذا:

#define as ;while

int main(int argc, char* argv[])
{
    int n = atoi(argv[1]);
    do printf("n is %d\n", n) as ( n --> 0);
    return 0;
}

انها مزيج من اثنين من المشغلين. الأول -- هو decrementing القيمة و > هو التحقق من ما إذا كانت القيمة أكبر من المعامل الأيمن.

#include<stdio.h>

int main()
{
    int x = 10;

    while (x-- > 0)
        printf("%d ",x);

    return 0;
}

سيكون الناتج:

9 8 7 6 5 4 3 2 1 0            

أو من أجل شيء مختلف تمامًا ... يتم عرض الشرائح x إلى 0

while (x --\
            \
             \
              \
               > 0)
     printf("%d ", x);

ليس رياضيا ، ولكن ... كل صورة ترسم ألف كلمة ...


مثال جيد على هذا الصب هو استخدام * = أو / =

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

أو

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

أو

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

أو

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'






c++ operators code-formatting standards-compliance