c++代码结构

noco

2018-10-07 17:12:16

Personal

内容部分来自@ritime

原址

主要是给初学者看的 希望大佬轻喷

代码结构

// 开头注释,或是一些奇怪的东西

#include <...>
#include <...>
#include <...>
// #include <bits/stdc++.h>: someone may love it. This is OK in NOI.

// 花式宏定义
// 一些简单的函数

struct XXPoint {
    // 某某 struct
};

struct XXTree {
    // 某某数据结构
};

void aaa() {
    // ...
}

inline int bbb() {
    // ...
}

// ...

int main() {
    // 开文件
    init();
    work();
    return 0;
}

至于到底该怎么写,这都是个人的习惯和爱好。

这里只是建议每个函数不宜过长,最好不要有超过 20 行的函数,因为这种很长的函数不利于代码调试。

空格与空行

通常,很多表达式的中间我们都会打上一个空格,用来凸显运算符的位置。一个很长的表达式没有空间,都是比较难以阅读的。如下面这个表达式:

x1=-b+sqrt(b*b-4*a*c)/2/a;x2=-b-sqrt(b*b-4*a*c)/(2*a);// 解方程

普遍会写成这样:

x1 = -b + sqrt(b * b - 4 * a * c) / 2 / a;
x2 = -b - sqrt(b * b - 4 * a * c) / (2 * a);  // 注释与代码之间通常也有 1-2 个的空格

相比之下,下面这个在代码中就清晰很多。

当然,如果你觉得像 4 a c 这种可以写的和数学公式 4ac 一样紧凑,4ac 也是可以接受的。

打这种空格并不需要花费什么时间,只要多试几次,自然就熟悉了。

我们的目的在于希望通过这种习惯性的空格来减少自己检查错误的时间。

空行通常用于分隔两段作用有明显差异的代码块,如两个函数之间、同一个函数的不同步骤之间。

这个时候写点注释也是可以的,但是上了考场,由于时间原因,大家普遍不会写注释......

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;

const int N=1e7+1e5;

int n,m;

int prime[N],pn;
bool notprime[N];

void get_prime(){
    pn=0;
    notprime[1]=true;

    for(int i = 1;i <= n;i++)
    {
        if(!notprime[i])
        {
            prime[pn++]=i;
        } 
        for(int j = 0;j < pn && prime[j] * i <= n;j++)
        {
            notprime[prime[j] * i]=true;
            if(!(i % prime[j]))break;
        }
    }
}
int main()
{
    int q;
    scanf("%d%d",&n,&m);

    get_prime();

    for(int i = 1;i <= m;i++)
    {
        scanf("%d",&q);
        if(notprime[q])
        {
            printf("No\n");
        }else printf("Yes\n");
    }

    return 0;
} 

关于换行 还是要多说几句

  1. for循环后的花括号 尽量换行 如果有循环嵌套 不要把一堆花括号写在一起

    比如

    for(int i = 1;i <= n;i++)
    {
    for(int j = 1;j <= m;j++)
    {
        ......
    }
    }//可能会好看点

    再或者

    while(...){
        ...
    }
    do{

    }while(...)
  1. if语句

    if(...)
    {
    ....
    }else if(...)
    {
    
    }else{
        ...
        }

    或者

    if(...){
        ...
    }else{
        ...
    }

    命名习惯

通常普遍为大家所接受的就是使用英文(或简写),而不是拼音乃至拼音简写。我见过一个比较极端的例子就是 ksm。乍一看不知道是个什么东西,直到看了代码才知道是 “快速幂” 的意思......一般这种函数通常都会写做 quick_pow 或者是 qpow。当然,上面的结论是基于方便他人理解你的代码而得出的。在 OI 中,基本没人会在意你是怎么写的。所以如果你更熟悉我们的国语,使用拼音命名法也无妨。

兼顾阅读效率和编码效率,我的推荐是名称最好 2-4 个字符,超过 6 个字符是不太适合的。之所以不推荐 1 个字符,是因为容易产生命名冲突,也就意味着容易写错代码。

下面列举了一些在 OI 中常见的写法及其含义:

当然,每个人都会有自己的喜好,你可以参照上面来简化你的命名规范。