c++ - ما هو "->" المشغل في C ++؟


بعد قراءة الميزات المخفية والزوايا المظلمة من C ++ / المحكمة الخاصة بلبنان على comp.lang.c++.moderated ، وفوجئت تماما أن مقتطف التالية جمعت وعملت في كل من فيسوال ستوديو 2008 و G ++ 4.4.

إليك الشفرة:

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

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




Answers


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

تنخفض التعليمات البرمجية الشرطية x ، في حين ترجع القيمة الأصلية (لا تنقص) x ، ثم تقارن القيمة الأصلية مع 0 باستخدام عامل التشغيل > .

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

while( (x--) > 0 )



هذا هو مشغل معقد جدا، لذلك حتى إسو / إيك JTC1 (اللجنة الفنية المشتركة 1) وضعت وصفها في قسمين مختلفين من معيار C ++.

ويمزحان جانبا، وهما عاملان مختلفان: -- و > موصوفان على التوالي في الفقرتين 5.2.2 / 2 و 5.9 من المعيار C ++ 03.




أو لشيء مختلف تماما ... x الشرائح إلى 0

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

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




وهو ما يعادل

while (x-- > 0)



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

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

؛)




انها

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

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

     return 0;
}

مجرد مساحة تجعل الأمور تبدو مضحكة، -- إنقاص و > يقارن.




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




while( x-- > 0 )

هو كيفية تحليل ذلك.




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

وفي هذه الحالة، فإن عبارة:

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

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




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

#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;
}



هذا هو بالضبط نفس

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

للأرقام غير السالبة




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

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




يقارن هذا الرمز الأول x و 0 ثم ينخفض ​​x. (وقال أيضا في الجواب الأول: أنت بعد تناقص 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



سوف مترجم بلدي طباعة 9876543210 عند تشغيل هذا الرمز.

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

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

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

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

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

ومن الجميل أن الأصلي يبدو وكأنه "في حين س يذهب إلى 0" على الرغم من.




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




-- هو مشغل التناقص و > هو أكبر من المشغل.

يتم تطبيق المشغلين كما واحد واحد مثل --> .




في الواقع، x هو ما بعد التناقص ومع هذا الشرط هو التحقق. انها ليست --> ، انها (x--) > 0

ملاحظة: يتم تغيير قيمة x بعد التحقق من الشرط، لأنه بعد تناقص. ويمكن أيضا أن تحدث بعض الحالات المماثلة، على سبيل المثال:

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0



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

#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            



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

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




لماذا كل المضاعفات؟

الإجابة البسيطة على السؤال الأصلي هي فقط:

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

هل نفس الشيء. لا أقول أنك يجب أن تفعل ذلك من هذا القبيل، لكنه يفعل الشيء نفسه، وكان قد أجاب على السؤال في وظيفة واحدة.

و x-- هو مجرد الاختزال لما سبق، و> هو مجرد العادي أكبر من المشغل. لا سر كبير!

هناك الكثير من الناس الذين يجعلون الأمور البسيطة معقدة في الوقت الحاضر؛)




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

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

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

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

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

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