- #include<stdio.h>;
-
void main()
-
{
-
char *ptr = "csdn";
-
printf( "%c\n",*(ptr++) );
-
}
-
-
结果是什么,不许用编译器,看题后5秒钟内开始回答,还要说出原因
- #include<stdio.h>;
-
void main()
-
{
-
int i = 10;
-
i << 1;
-
i >;>; 5;
-
printf( "%d\n", i);
-
}
第一个是c,ptr++是在语句执行完后才执行++操作的,有没有括号都一样。
第二个是10,单独的没有赋值的移位操作是不会改变原数大小的。
如果改成i=i<<1;i=i>;>;5;的话,结果就是0了。
- *(ptr++) != *(ptr+1),
-
后面的那个表达式确实由于括号的原因改变了优先级,从而应该输出s,
-
但后缀加运算的规则是不同的,有一个简单的例子,
-
for(i=0;i<n;i++)
-
{
-
printf("%d\n",i);
-
}
-
输出一定是0-9吧,换一种写法,
-
for(i=0;i<n;(i++))
-
{
-
printf("%d\n",i);
-
}
-
这是会是什么情况呢?还是0-9,不可能变成1-10的。
-
-
其实原因就是,后缀加语句在一个复合语句中的时候,
-
一定是先使用变量的值,然后再进行加1操作的。
-
以上是我自己对C的理解,暂时无法提供更好的参考资料,
-
要是有不当的地方还请见谅。
------------------------------------------------------
因为*.++处于同一优先级14级,改级的结合方向是 右-->;左,++比*先来做,所以括号不要了.
-------------------------------------------------------
从编译原理上说,n++运算的语法定义恐怕是(yacc语法示意):
- {val}'+''+' :{$$=$1;$1=$1+1}
-
;
加不加()不影响表达式的值。