C\C++代码规范

C\C++代码规范


我也是在noip吧里发现的,举得写得真心不错,所以贴上来了。感谢elf465504453

发现N多人代码都不怎么规范,有的是旧标准的风格(MS被谭浩强带的),有的是Dev-C++的坏习惯。这些非常容易导致CE或RE,特发此帖。

1.main函数类型与返回值,严重!!
main函数一定要定义成int,不能用void,更不能用long(还没见过)。最后程序结束一定要打return 0;因为最终评测是在Linux下,如果不返回0的话系统会返回随机数,如果刚好返回的是错误代号(如-1),那么整个程序判定运行错误,得0分。
2.C与C++语法混淆
曾经有一哥们找我求助,说他的C程序本机上编译通过,交到OJ却CE,我给他看了下,有这么几个错误。
简略代码:
void solve(...)
{
struct node *a,*b;
.....
struct node *root=(struct node*)malloc(sizeof(struct node));
}
报错!因为这里声明了临时变量,而C不允许声明临时变量。但是在某些编译系统下是可以通过的,为了保险起见,C就不要声明临时变量了。C++可以。
至于C++的//注释,C99早已添加到C中,故可放心。
还有,不要在C中用bool类型变量,这不是C的!另外C有一个带下划线的布尔类型,虽然与bool功能一致,但下划线开头是不允许使用的。
3.include库文件
相当严重的问题,原因是Dev-C++那个破程序造就的某些坏习惯。
示例(为了清晰,我用C代码表示):
#include<stdio.h>
int a[10000];
int main()
{
......
memset(a,0,sizeof(a));
....
return 0;
}
这段代码在Dev-C++下不会有问题,可如果放到Linux编译直接报错!!原因是memset函数并没有被声明在stdio.h里,而是在string.h(C++是cstring)。但是Dev-C++因为采用旧版本的编译器,这样的代码可以通过。极度危险!!!!!
因此,建议大家卸载Dev-C++安装其他的IDE(比如code::blocks),或者至少更新Dev-C++内置的编译器套件。最好的办法是直接使用Linux系统。
另外,还有一些函数需要对应的库:
malloc动态内存分配,使用的时候最好加上#include<malloc.h>,C++是#include<cmalloc>。不然会提示警告,保险一点。
qsort函数,在stdlib.h(C)和<cstdlib>(C++)里。
另外,使用C的同学请不要尝试包含C++的头文件,否则后果自负……
4.系统差异
最终评测是在Linux下,但比赛时候可能用Windows,两者差异最严重的一点是换行的识别。Windows是\n和\r,Linux只有\n,因此在程序识别换行时,请务必考虑。尽量优化你的算法使其不受这点影响(大部分题不受影响,但要注意)。
5.#include的格式
主要问题是C++的,经常见到这样的代码
#include<iostream>
#include<cstdio>
#include<string.h>

看出来了吗?C++与C的头文件混用,尽管C++兼容C的头文件,但是这样会引起一些潜在的错误(cstring与string.h是不一样的),因此,请在使用C函数的时候请一律去掉.h再在开头加上字母c!
6.指针问题
相当隐蔽,很多人甚至无法查出。
示例:
#include<cstdio>
#include<cstring>
int a[1000];
void init(int a*)
{
memset(a,0,sizeof(a));
.....
}
......

原意是想通过init函数对a数组清零,但是事实上函数参数“int a*”只是传了个a的首地址指针过去,这样一个memset会只把a[0]变成0。
解决方案:直接应用全局变量吧……传参还费时间呢

7.文件处理
如果使用fopen打开文件,请一定使用fclose关闭
如果你使用文件流,按照C++标准是不需要close关闭的,但是为了保险,还是使用close关闭吧!
示例:
#include<stdio.h>
int main()
{
FILE *fp;
fp=fopen(....");
....
fclose(fp);
return 0;
}
#include<fstream>
int main(void)
{
ifstream fin(....);
....
fin.close();
return 0;
}
哪怕你用freopen重定向标准输入输出,也请你最后fclose(stdin);fclose(stdout);毕竟保险!C++的cin和cout重定向也一样。

另外,像Pascal会重点强调,在程序中如果中途强制退出程序时,请一定要保存好文件。C\C++也一样,退出程序函数是exit(和Pascal不同)。

信息学竞赛千变万化,一个字母打错可能就导致满盘皆输,因此请大家一定要注意!!


暂时就想到这么多,欢迎大家补充!!!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值