Thread: quick syntax question

  1. #1
    Registered User
    Join Date
    Dec 2009
    Posts
    39

    quick syntax question

    can someone explain to me what's happening here plz?

    Code:
    *(s->top)++=c;
    I know s is a pointer to a struct, so *(s->top) is the top value of the struct s points to.

    I don't understand what ++= means though.

  2. #2
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    28,410
    Space it out a little and it might become more obvious:
    Code:
    *(s->top)++ = c;
    Quote Originally Posted by Bjarne Stroustrup (2000-10-14)
    I get maybe two dozen requests for help with some sort of programming or design problem every day. Most have more sense than to send me hundreds of lines of code. If they do, I ask them to find the smallest example that exhibits the problem and send me that. Mostly, they then find the error themselves. "Finding the smallest program that demonstrates the error" is a powerful debugging tool.
    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  3. #3
    spurious conceit MK27's Avatar
    Join Date
    Jul 2008
    Location
    segmentation fault
    Posts
    8,300
    It adds one to the position of the pointer (s->top), altho I think it would be better written as:

    *((s->top)++)) = c;

    since it might instead add one to the value of s->top (which is pointless in an assignment).

    I'd have to do a quick experiment to tell the difference.
    Last edited by MK27; 12-21-2009 at 11:07 AM.
    C programming resources:
    GNU C Function and Macro Index -- glibc reference manual
    The C Book -- nice online learner guide
    Current ISO draft standard
    CCAN -- new CPAN like open source library repository
    3 (different) GNU debugger tutorials: #1 -- #2 -- #3
    cpwiki -- our wiki on sourceforge

  4. #4
    DESTINY BEN10's Avatar
    Join Date
    Jul 2008
    Location
    in front of my computer
    Posts
    804
    Dont you think a * with (s->top) is illegal coz the value of top will be given by s->top if top is a member of struct having pointer s?
    HOPE YOU UNDERSTAND.......

    By associating with wise people you will become wise yourself
    It's fine to celebrate success but it is more important to heed the lessons of failure
    We've got to put a lot of money into changing behavior


    PC specifications- 512MB RAM, Windows XP sp3, 2.79 GHz pentium D.
    IDE- Microsoft Visual Studio 2008 Express Edition

  5. #5
    spurious conceit MK27's Avatar
    Join Date
    Jul 2008
    Location
    segmentation fault
    Posts
    8,300
    Quote Originally Posted by BEN10 View Post
    Dont you think a * with (s->top) is illegal coz the value of top will be given by s->top if top is a member of struct having pointer s?
    Not if member "top" is also a pointer.
    Code:
    struct {
         int *top
    C programming resources:
    GNU C Function and Macro Index -- glibc reference manual
    The C Book -- nice online learner guide
    Current ISO draft standard
    CCAN -- new CPAN like open source library repository
    3 (different) GNU debugger tutorials: #1 -- #2 -- #3
    cpwiki -- our wiki on sourceforge

  6. #6
    DESTINY BEN10's Avatar
    Join Date
    Jul 2008
    Location
    in front of my computer
    Posts
    804
    Quote Originally Posted by MK27 View Post
    Not if member "top" is also a pointer.
    Code:
    struct {
         int *top
    Ohhhhh......I was assuming it just an int.
    HOPE YOU UNDERSTAND.......

    By associating with wise people you will become wise yourself
    It's fine to celebrate success but it is more important to heed the lessons of failure
    We've got to put a lot of money into changing behavior


    PC specifications- 512MB RAM, Windows XP sp3, 2.79 GHz pentium D.
    IDE- Microsoft Visual Studio 2008 Express Edition

  7. #7
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    28,410
    Quote Originally Posted by MK27
    altho I think it would be better written as:

    *((s->top)++)) = c;

    since it might instead add one to the value of s->top (which is pointless in an assignment).
    I feel that if you think that *p++ might be misconstrued as (*p)++, then you should break it up instead of trying to clarify with parentheses. The parentheses spoil the fun of having such a condensed expression, in my opinion (so... *s->top++=c; FTW!)
    Quote Originally Posted by Bjarne Stroustrup (2000-10-14)
    I get maybe two dozen requests for help with some sort of programming or design problem every day. Most have more sense than to send me hundreds of lines of code. If they do, I ask them to find the smallest example that exhibits the problem and send me that. Mostly, they then find the error themselves. "Finding the smallest program that demonstrates the error" is a powerful debugging tool.
    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  8. #8
    Registered User
    Join Date
    Dec 2009
    Posts
    39
    so if I get it right *(s->top)++=c; equals

    Code:
    int *ptr = s->top;
    *ptr=c;
    ptr++;
    s->top=ptr;
    ?

  9. #9
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    28,410
    In effect, yes. Alternatively:
    Code:
    *(s->top) = c;
    (s->top)++;
    Quote Originally Posted by Bjarne Stroustrup (2000-10-14)
    I get maybe two dozen requests for help with some sort of programming or design problem every day. Most have more sense than to send me hundreds of lines of code. If they do, I ask them to find the smallest example that exhibits the problem and send me that. Mostly, they then find the error themselves. "Finding the smallest program that demonstrates the error" is a powerful debugging tool.
    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  10. #10
    spurious conceit MK27's Avatar
    Join Date
    Jul 2008
    Location
    segmentation fault
    Posts
    8,300
    Quote Originally Posted by laserlight View Post
    In effect, yes. Alternatively:
    Code:
    *(s->top) = c;
    (s->top)++;
    Ixnay. The post-increment will occur before the assignment. If the point is to add one to the value of s->top, the ++ does nothing in the end.

    If the point is to make s->top point to what was the equivalent of s->top[1], then that space better be part of s, because it will be set to the value of c.
    C programming resources:
    GNU C Function and Macro Index -- glibc reference manual
    The C Book -- nice online learner guide
    Current ISO draft standard
    CCAN -- new CPAN like open source library repository
    3 (different) GNU debugger tutorials: #1 -- #2 -- #3
    cpwiki -- our wiki on sourceforge

  11. #11
    Officially An Architect brewbuck's Avatar
    Join Date
    Mar 2007
    Location
    Portland, OR
    Posts
    7,398
    Quote Originally Posted by MK27 View Post
    Ixnay. The post-increment will occur before the assignment.
    The post-increment does not happen until after s->top has been fully evaluated. Whether it occurs before or after the assignment does not change the result.

    The line of code stores 'c' into the location pointed to by s->top, then increments s->top.
    Code:
    //try
    //{
    	if (a) do { f( b); } while(1);
    	else   do { f(!b); } while(1);
    //}

  12. #12
    spurious conceit MK27's Avatar
    Join Date
    Jul 2008
    Location
    segmentation fault
    Posts
    8,300
    Quote Originally Posted by brewbuck View Post
    The post-increment does not happen until after s->top has been fully evaluated. Whether it occurs before or after the assignment does not change the result.

    The line of code stores 'c' into the location pointed to by s->top, then increments s->top.
    Sorry -- I was looking at this order of precedence table:

    C Operator Precedence Table

    However, it's obviously wrong as even the simple:
    Code:
    int a = 5, b = a++;
    demonstrates (which if it were my code, I'd have been writing it and noticed )
    C programming resources:
    GNU C Function and Macro Index -- glibc reference manual
    The C Book -- nice online learner guide
    Current ISO draft standard
    CCAN -- new CPAN like open source library repository
    3 (different) GNU debugger tutorials: #1 -- #2 -- #3
    cpwiki -- our wiki on sourceforge

  13. #13
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    28,410
    hmm... I sent you this in my PM, but anyway...

    Quote Originally Posted by MK27
    I glanced at an "order of precedence" table here:

    C Operator Precedence Table

    wherein ++ has higher precedence than =, but obviously, as a couple of quick experiments demonstrated, that is not true.
    It is true that postfix increment operator has a higher precedence than the copy assignment operator. But what that means is that this:
    Code:
    a = b++;
    should be interpreted as:
    Code:
    a = (b++);
    rather than:
    Code:
    (a = b)++;
    whereas this:
    Code:
    a = b, c;
    should be interpreted as:
    Code:
    (a = b), c;
    not:
    Code:
    a = (b, c);
    since the copy assignment operator has a higher precedence than the comma operator.

    EDIT:
    Perhaps you are missing a fundamental point: the result of a++ is the value of a before the increment.
    Last edited by laserlight; 12-21-2009 at 01:34 PM.
    Quote Originally Posted by Bjarne Stroustrup (2000-10-14)
    I get maybe two dozen requests for help with some sort of programming or design problem every day. Most have more sense than to send me hundreds of lines of code. If they do, I ask them to find the smallest example that exhibits the problem and send me that. Mostly, they then find the error themselves. "Finding the smallest program that demonstrates the error" is a powerful debugging tool.
    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  14. #14
    Officially An Architect brewbuck's Avatar
    Join Date
    Mar 2007
    Location
    Portland, OR
    Posts
    7,398
    Quote Originally Posted by MK27 View Post
    Sorry -- I was looking at this order of precedence table:

    C Operator Precedence Table

    However, it's obviously wrong as even the simple:
    Code:
    int a = 5, b = a++;
    demonstrates (which if it were my code, I'd have been writing it and noticed )
    Precedence controls order of binding, not order of operations. It specifies which operations will occur to which expressions, not when they will occur. The order of operations is controlled by associativity and sequence points. Operators in different precedence classes are treated independently when determining associativity.

    On top of all that, the compiler can evaluate the expression any way it likes, so long as the result is the same as if it had done it in the order defined by the language.

    The code in question looks like it's pushing something onto a stack.
    Code:
    //try
    //{
    	if (a) do { f( b); } while(1);
    	else   do { f(!b); } while(1);
    //}

  15. #15
    spurious conceit MK27's Avatar
    Join Date
    Jul 2008
    Location
    segmentation fault
    Posts
    8,300
    Well that is very deceptive then isn't it

    I guess the best means of resolving uncertainty is still actual experimentation.
    C programming resources:
    GNU C Function and Macro Index -- glibc reference manual
    The C Book -- nice online learner guide
    Current ISO draft standard
    CCAN -- new CPAN like open source library repository
    3 (different) GNU debugger tutorials: #1 -- #2 -- #3
    cpwiki -- our wiki on sourceforge

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. using c++ in c code
    By hannibar in forum C Programming
    Replies: 17
    Last Post: 10-28-2005, 09:09 PM
  2. Dikumud
    By maxorator in forum C++ Programming
    Replies: 1
    Last Post: 10-01-2005, 06:39 AM
  3. ras.h errors
    By Trent_Easton in forum Windows Programming
    Replies: 8
    Last Post: 07-15-2005, 10:52 PM
  4. Learning OpenGL
    By HQSneaker in forum C++ Programming
    Replies: 7
    Last Post: 08-06-2004, 08:57 AM
  5. Quick question: exit();
    By Cheeze-It in forum C Programming
    Replies: 6
    Last Post: 08-15-2001, 05:46 PM