一些代码吐槽
Contents
奇特的代码集录(持续更新)
虽然这篇分在代码风格教程下面,但实际用于收集我看到过的“神奇”代码。
一、代码风格难以描述
(一)、来自某些课件上的代码
我实名 diss 这种代码。
#include<stdio.h>
main( )
{ float x;
double y,f(float x);/*采用函数原型进行函数向前引用说明*/
x=1.0f;
y=f(x);
printf("y=%f\n", y);
}
double f(float x)
{ double y;
y=2*x+1.0;
return(y);
}
这代码可以说汇集了一大片我难以忍受的代码风格:
- 左大括号后面加个缩进继续写代码?你是真的嫌自己代码行数太多?那为什么不使用大括号不换行?
double f(float x) { //do something... }
这样写不好吗?
你的
main
函数是祖传没有返回值吗?你不知道返回值可以说明程序运行情况吗?好好的一个函数,一个文件,也没有互相调用,为什么要把函数放在
main
函数之下?不声明一下函数并加长代码长度你是浑身上下不舒服吗?return(y);
你是把return
当个函数用吗?return y;
这种常用而美观且少一个字符的写法你是多不喜欢?加注释大家都开心,但可以单行注释为什么偏要块注释?
(二)、来自某些询问我的代码
先说好,这里只是说这些代码不合理,考虑到大多数同学在我提出建议后还是愿意修改的,放在这里主要起一个警示作用。(放心只放代码不写人名)
#include <stdio.h>
#include <math.h>
double sabc(double a,double b,double c)
{ double s,p;
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
return(s);
}
main()
{double a,b,c,s;
double sabc(double);
scanf("%d %d %d",&a,&b,&c);
s=sabc(a,b,c);
printf("sabc=%lf",s);
}
除了跟上面某代码学来的不好习惯外,还有:
- 缩进消失,代码可读性极差;
scanf
强行规定分隔符,有一定风险。
还有某位同学保持了很久的奇特习惯:除了函数的大括号不换行,其他大括号换行?
行吧,这种还勉强可以接受,但尽量改一下吧。
二、代码神奇写法
(一)、奇特的命名方法
int shengyushijian;
这个命名我印象深刻,所以为啥不用 rest
这种简洁明了的写法呢?
int temporary,count;
虽然这样使用英文看上去不那么违和,但是 temp
的简称大家也是看得懂的吧,这么长只是加重自己写代码的负担啊。(而且你看 C/C++ 中的 int
不就是简称吗)
count
有和系统关键字重合的风险,所以大家都习惯用 cnt
简称。
同样道理的还有 return
简称 ret
,result
简称 res
。
在 for
内部定义循环控制变量 i
,会让代码看起来更加紧凑,并使得 i
的作用域被限制在整个 for
循环语句内部(包括循环条件和循环体),减小了命名冲突的概率。在以后的编码过程中,我推荐这种写法。
(二)、奇特的写法
第一种:
for (int i=0;i!=k;i++)
看上去没啥毛病,除了写成 i<k
更好。
但是实际想法是实现 i=0...n-1
然后除了 i=k
?
发现问题以后,又出现了新的写法:
for (int i=0;i!=k&&i<n;i++)
这个有区别吗?
for (int i=0;i<n;i++)
if (i!=k)
这样的写法不是很好吗?
第二种:
while (x!=n) continue;
你可能没有搞清楚判断和循环的区别,而且 continue
和 break
只对最里层循环生效啊。
第三种:
i=i+1;
请问这个跟 i++
或者 ++i
的区别是什么?
a=a+b;
x=x/y;
不写成 a+=b
或者 x/=y
的理由是什么?
虽然如果 y
换成一个复杂的表达式确实写成这样很正常,但这里就一个 y
啊。
第四种:
代码就不放了,太难找了。
大概就是在 oj 上做题,认为比如全部读入完才能开始输出。
同学,输入输出流是两个流啊?你以为评测时的输出是从命令行中截取的吗?输入输出流之间真的基本毫无关系啊。
未完待续。。。
Comments: 3
第一份远古代码xs
应该是K&R C
那个时代不写返回值默认int 而且只有块注释
那个鬼畜缩进似乎也是K&R书上的
然而9102年某课件还这么教怕不是误人子弟…
emmm对这种考古代码完全不了解
这个遇到
i==k
的情况就直接退出循环了吧。