运算符优先级的比较

  1. 补充一个关于gets()函数的使用问题
  2. 一点感受

我一见你就笑。

首先非常非常感谢今晚一个朋友的提问,给我纠正了一个很长时间的错误知识。

一段代码

1
2
3
4
5
6
7
8
int main(int argc, const char * argv[]) {
char s[100];
gets(s);
char *t = s;
printf("%c %c\n",*t+1,*(t+1));

return 0;
}

输入&输出

1
2
aa
b a
在这之前我一直有个错误认识,那就是「+」运算符的优先级是高于「*」取值运算符的,
然而一道程序设计题目debug的过程中我才发现「+」运算符的优先级其实是低于「*」运算符的

如上文输出

*t+1 的执行也就是:先求值 *t 然后再求值 *t + 1
而 *(t+1) 也就是:先求值 t + 1 然后在求值 *(t+1)

还有关于「*p++」的问题

一段程序:

1
2
3
4
5
6
7
8
int main(int argc, const char * argv[]) {
char s[100];
gets(s);
char *t = s;
printf("%p %c %p %c\n",t,*t++,t,*t);

return 0;
}

输入&输出

1
2
abc
0x7ffeefbff5d0 a 0x7ffeefbff5d1 b

如上文输出

根据百度的结果 「++」运算符的优先级与「*」取值运算符的优先级相等
因此会先执行「*」取值运算然后再对指针t执行「++」运算

补充一个关于gets()函数的使用问题

  1. gets是从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。

  2. gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序。

  3. 读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。

一点感受

因为被误以为编程学习进度快(雾,经常帮别人讲几道题的原因,我从中也获得了很多的收获,因为人跟人思维的不同,往往会接触到不同的思路,一段新代码的阅读又作为一次次的练习,深得益处,因此常常觉得我也该向向我问问题的说声谢谢,谢谢对我水平的认可,谢谢对我水平的促进,「求知若饥,虚心若愚」。

script>