一些代码吐槽

一些代码吐槽

奇特的代码集录(持续更新)

虽然这篇分在代码风格教程下面,但实际用于收集我看到过的“神奇”代码。

一、代码风格难以描述

(一)、来自某些课件上的代码

我实名 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);
} 

这代码可以说汇集了一大片我难以忍受的代码风格:

  1. 左大括号后面加个缩进继续写代码?你是真的嫌自己代码行数太多?那为什么不使用大括号不换行?
    double f(float x) {
       //do something...
    }
    

    这样写不好吗?

  2. 你的 main 函数是祖传没有返回值吗?你不知道返回值可以说明程序运行情况吗?

  3. 好好的一个函数,一个文件,也没有互相调用,为什么要把函数放在 main 函数之下?不声明一下函数并加长代码长度你是浑身上下不舒服吗?

  4. return(y); 你是把 return 当个函数用吗?return y; 这种常用美观且少一个字符的写法你是多不喜欢?

  5. 加注释大家都开心,但可以单行注释为什么偏要块注释?

(二)、来自某些询问我的代码

先说好,这里只是说这些代码不合理,考虑到大多数同学在我提出建议后还是愿意修改的,放在这里主要起一个警示作用。(放心只放代码不写人名)

#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);
}

除了跟上面某代码学来的不好习惯外,还有:

  1. 缩进消失,代码可读性极差;
  2. scanf 强行规定分隔符,有一定风险。

还有某位同学保持了很久的奇特习惯:除了函数的大括号不换行,其他大括号换行?

行吧,这种还勉强可以接受,但尽量改一下吧。

二、代码神奇写法

(一)、奇特的命名方法

int shengyushijian;

这个命名我印象深刻,所以为啥不用 rest 这种简洁明了的写法呢?

int temporary,count;

虽然这样使用英文看上去不那么违和,但是 temp 的简称大家也是看得懂的吧,这么长只是加重自己写代码的负担啊。(而且你看 C/C++ 中的 int 不就是简称吗)

count 有和系统关键字重合的风险,所以大家都习惯用 cnt 简称。

同样道理的还有 return 简称 retresult 简称 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;

你可能没有搞清楚判断和循环的区别,而且 continuebreak 只对最里层循环生效啊。

第三种

i=i+1;

请问这个跟 i++ 或者 ++i 的区别是什么?

a=a+b;
x=x/y;

不写成 a+=b 或者 x/=y 的理由是什么?

虽然如果 y 换成一个复杂的表达式确实写成这样很正常,但这里就一个 y 啊。

第四种

代码就不放了,太难找了。

大概就是在 oj 上做题,认为比如全部读入完才能开始输出。

同学,输入输出流是两个流啊?你以为评测时的输出是从命令行中截取的吗?输入输出流之间真的基本毫无关系啊。

未完待续。。。

 

点赞 0

Comments: 3

  1. 头像 panda2134说道:

    第一份远古代码xs
    应该是K&R C
    那个时代不写返回值默认int 而且只有块注释
    那个鬼畜缩进似乎也是K&R书上的
    然而9102年某课件还这么教怕不是误人子弟…

  2. 头像 skylee03说道:
    for (int i=0;i!=k&&i<n;i++)
    

    这个遇到 i==k 的情况就直接退出循环了吧。

Add your comment