|
发表于 2003-9-29 13:13:10
|
显示全部楼层
头疼,记得等号运算顺序是从右向左,这里怎么变成从左向右了?
- #include <stdio.h>
- int main()
- {
- char str[]="abcdefg";
- char *p=str;
- puts("");
- *p=*p++;
- puts(p);
- puts(str);
- *p++=*p;
- puts(p);
- puts(str);
- *++p=*p;
- puts(p);
- puts(str);
- *p=*++p;
- puts(p);
- puts(str);
-
- puts("");
- strcpy(str,"abcdefg");
- p=str;
- while(*p=toupper(*p++));
- puts(str);
- p=str;
- while(*p++=tolower(*p));
- puts(str);
- p=str;
- while(*p=toupper(*++p));
- puts(str);
- p=str;
- while(*++p=tolower(*p));
- puts(str);
- }
复制代码
输出结果如下:
[root@localhost test]# ./test2
bcdefg
abcdefg
cdefg
abcdefg
defg
abcdefg
efg
abceefg // !!!
ABCDEFG
abcdefg
BCDEFG
Bcdefg
***********
修改此帖时加此注:对于上面的问题,搞明白了,“=”的运算顺序是从左向右,不是从右向左,参见“《高质量C++/C编程指南》林锐 博士 2001”第4.1节,运算符的优先级,对于上面“!!!”部分我解释如下:编译器扫描*p=*++p的时候,首先扫描的是“=”左边的*p,此时指向ptr,继续扫描“=”号右边的表达式的时候,发现前++,此时给p进行++,再取*,而且"="左边的已经取值完毕,所以使得两边取值不同,他等同于*(n)=*(n+1)。个人理解,请指点。
关于下面的assert还是不明白,为什么断言失败?哪位能解释一下?谢了。
***********
上面提到的assert,经查assert.h中有如下定义:
- extern void __assert (const char *__assertion, const char *__file, int __line)
- __THROW __attribute__ ((__noreturn__));
- # define assert_perror(errnum) \
- (__ASSERT_VOID_CAST (!(errnum) ? 0 : \
- (__assert_perror_fail ((errnum), __FILE__, __LINE__, \
- __ASSERT_FUNCTION), 0)))
复制代码
对于test3.c这个程序:
- #include <assert.h>
- #include <stdio.h>
- int main()
- {
- int i=3;
- assert(i++ == i);
- }
复制代码
执行cpp test3.c后显示如下:
- ......
- int main()
- {
- int i=3;
- ((void) ((i++ == i) ? 0 : (__assert_fail ("i++ == i", "test3.c", 7, ((const char *) 0)), 0)));
- }
复制代码
即使是宏替换,也没有理由assert断言失败啊感觉。
真的头疼了...... |
|