C语言指针与++结合性的问题



 #include<stdio.h>
int main()
{
    char a[80],b[10], *s1,*s2;
    s1=a;
    s2=b;
    printf("input s1:\n");
    gets(s1);
    printf("input s2:\n");
    gets(s2);

    while(*s1)
    {
       s1++;
    }
    while(*s2)
    {
      //*(s1++) = *(s2++);
      //*s1++ = *s2++;
        (*s1)++ = (*s2)++;
    }
    *s1='\0';
    printf("result is %s",a);
}

在上面的第二个while中的三行代码是独立的,我的问题是,为什么注释其中两行后运行其中一行得到的结果是一样的,编译环境是Gcc 4.4.7

c 编程 gcc

花泽理惠_ 10 years, 4 months ago

*s1++ = *s2++; (*s1)++ = (*s2)++; 都是先把*s2赋给*s1,但是赋值之后前者是指针自增,后者是指针指向的内容自增。括号不能改变什么时候自增,但是可以改变自增的作用目标。
至于 *(s1++) = *(s2++); ,和 *s1++ = *s2++; 一样,因为这两个运算符是同级且右结合的,这时自增肯定先被解析(不是先算)。

badkind answered 10 years, 4 months ago

++和*同级,右结合。

于是++先运算,给s1(s2)加上“用完要加哦”的状态。

然后进行 运算,取出,当s1(s2)完成 运算之后+1。

两种都是++先运算。然而++的意义就在于此,并不是+1,而是加上“用完要加哦”的状态。

回答可能不科学,但通俗易懂

最下面的那一个//第三个

用括号进行先取位,然后++作用的是取出来之后的值。

三美姬D輪姦 answered 10 years, 4 months ago

因为你不能通过 () 改变 ++ 的运算优先级.

北斗♂精子 answered 10 years, 4 months ago

Your Answer