C语言常见误区
来源:互联网 发布:互助系统源码带排单币 编辑:程序博客网 时间:2024/04/30 04:22
1. void main()、void main(void)、main()以及int main():
有人说前两种是完全不对的,只不过是编译器支持而已,其实这样说也不太对。实际上,C99已经允许为main声明“由实现定义的行为”(返回类型可以不是int型,也可以不是标准规定的参数),所以这样的行为是合法的。但是看起来很难看并且可移植性不好,最重要的是别人一看这样的代码就知道你C没学过关。
第三种是C89及之前的写法,现在已经过时。最后一种虽然在排斥void main()的人群中使用的比较普遍,但其实不属于函数声明,也被认为是一种过时的写法,C: A Reference Manual写到“所有现代的C代码都应该使用原型来编写。C99把旧式的非原型形式当成是过时的”,这种写法虽然不是无中生有,但起码也算正确。不过最标准的形式当然是int main(void)和int main(int argc, char *argv[])或int main(int argc, char **argv)。
2. i+++++i和k=i++ + ++i:
前者根本就无法通过编译,因为编译器把它看成了:((i++)++)(+i)。
后者k的值未定义,因为完整表达式末尾才是Sequence Point,i到底是何时自加何时做加法都不确定。
3.fflush(stdin):
fflush(stdin)是未定义的,在C: A Reference Manual写到:
“fflush函数清空于输出相关联的所有缓冲区,或者更新流参数。”
很多时候可以用如下代码代替它:
while (getchar() != '\n') continue; // or ;
需要多次使用时可以自己定义一个宏:
#define FLUSH while (getchar() != '\n')
如果看不懂怎么回事那就说明你对getchar()了解过少。
4.sizeof是什么?
很多人认为sizeof是个函数,我建议你试试如下代码:
int i;printf("%lu %lu\n", (unsigned long)sizeof(int), (unsigned long)sizeof i);
printf("%lu\n", (unsigned long)sizeof int);呢?
5. a+=1一定与a=a+1等价?
如果这里的a不是普通变量而是a[i++]呢?
显然a[i++]+=1和a[i++]=a[i++]+1是不等价的,如果不信,可以通过i的值判断出来。
6. 对scanf()的认知不足。
我见过某网站的C语言视频教程里的教师写了一个这样的程序:
#include <stdio.h>int main(void) {char c;scanf("%c", &c);while (c != 'J') {printf("No!\n");scanf("%c", &c);}return 0;}
然后他发现程序有问题,输入除J外的字母后会出现两行的No!,当时他不知道怎么回事,没有办法,就打马虎眼过去了。
你知道怎么修改这个错误吗?
我见过很多人改,大多数人都是加了好长的代码。
其实呢,只要把scanf("%c", &c);改成scanf(" %c", &c);,这样就忽略了之前的空白字符,问题就被解决了。
如果你不知道怎么回事,说明你对scanf()了解不足。
7. C90?
很多人只知道传统C、C89和C99,于是见到C90就不知为何物,甚至认为是别人说错了。
C90即C89,因为1900年当时的ANSI C被进行少量编辑性修改后被转换成了国际标准ISO/IEC 9899:1990,所以C89也可以被称作C90.
另外,你知道C95吗?
8. getch()能随便用吗?
getch()及其相关头文件conio.h都不是标准库的一部分,不知道这一点的后果很显而易见,一个典型例子就是如果你在Linux上试图使用这个函数会发现根本无法使用。如果IDE没有设置程序暂停那么应该使用getchar()(有时候要用多次以把输入队列中的回车读完),即使你用getch你也应该知道它的来源。
- c语言常见误区
- C语言常见误区
- C/C++ 常见误区
- c/c++常见误区
- C/C++ 常见误区
- C/C++ 常见误区
- C/C++ 常见误区
- C/C++ 常见误区
- C/C++ 常见误区
- C/C++ 常见误区
- C/C++ 常见误区
- C语言中的算符优先级 与 常见误区
- C/C++ 常见误区一
- 基础知识:C/C++ 常见误区
- c语言学习的误区
- C语言-unsigned使用误区
- (转)C/C++常见误区
- 常见误区
- 获取treeview中当前鼠标所指的节点treenode
- 进程
- org.hibernate.hql.ast.QuerySyntaxException:is not mapped
- C++的纯虚函数和抽象类
- MongoDB常用的操作命令
- C语言常见误区
- SQL 2005 -窗口函数(OVER)
- inline-block是什么意思
- ASP.NET中如何防范SQL注入式攻击
- Linux VI编辑器详解
- J2EE核心技术
- Unicode 下宽字节与多字节之间的转换
- LOAD_DLL_DEBUG_EVENT调试事件
- MongoDB安装及使用