zoukankan      html  css  js  c++  java
  • C 的 一些写法格式 交流

        好久以前刚开始学习前辈们的代码的时候,发现好多代码感到好奇怪.

          1)代码看不懂

          2)代码格式看不懂

    网上也没见同学们分享.当自己代码写多了,也渐渐的理解为什么要这样写了. 说主题之前 还是 说一些 题外话

    "代码怎么写,看人,但还是有一些范式的"

    下面就说一下,本人用的范式总结如下:

              首先 说 C中最重要的 东西 => 函数

    1. 函数声明范式

      首先是普通函数声明

    // 普通函数声明
    extern void heoo(int age);

    函数声明同时 再科普一下 C中关于 void 的用户,请看下面两行声明代码

    // 参数中带void
    extern void heoo(void);
    
    //参数中不带void
    extern void heoo();

    同样是声明,但是意思确实很大的不一样

    第一个函数声明 表示

      声明了一个 返回值void 函数名是heoo 参数为空的 函数.

    第二个函数声明表示

      声明了一个 返回值是void 函数名是 heoo 参数不确定 的函数.

    解释函数不确定的意思是,看下面代码

    //声明 参数不确定的函数
    extern
    void heoo(); //使用阶段,下面这些都是合法的 heoo(); heoo(1); heoo(1,1.00,"232");

    现在应该理解了,对于void特殊外,还有一种声明也比较特殊如下

    //可变函数声明
    extern void heoo(const char *fmt,...);

    关于函数声明 补充说明一下

      1) 函数声明的时候 extern可以省略,推荐封装库的时候不要省略

      2) C中声明参数名 可以省略,推荐不要省略,参数名能让人提高看懂这个接口的可能

      3) 函数声明C中什么都不加,默认参数是 不确定,C++ 默认是 void.

    2.函数定义范式

      首先看下面代码

    void
    heoo(int age)
    {
        printf("You age is %d!",age+16);      
    }

    这样的写法 是 函数定义部分,返回值占一行 ,是 为了 突出 函数返回值得重要性

    还有下面的写法

    void heoo(int age)
    {
        printf("age = %d.
    ",age);  
    }

    上面是函数 声明 + 定义 两部分组成的. 应用场景有 如下

    static int __getid(void)
    {
         static int __id = 0;
         ++_id;
         return __id;    
    }

    对于静态函数作用域只在当前文件,一般放在 *.c 文件下.那么就不需要声明.

    就可以将声明和定义放在一起写.

    3.关于其它语法的写法  

      1) 关于 if 语句

    //第一种 if
    if(age > 0)
        puts("年龄不小了!");
    
    //第二种if
    if(age < 0){
       age = 0;
       puts("别乱搞行吗!");    
    }
    
    //第三种
    if(age > 0){
       puts("age is %d");
       exit(EXIT_FAILURE);  
    }
    else {
       age = -1;
       printf("你好吗!");
    }

    //第四种
    if(age > 0){
       puts("age is %d");
       exit(EXIT_FAILURE); 
    }
    else if(age == -1){
     puts("ok");
    exit(EXIT_SUCCESS);
    }
    else {
       age = -1;
       printf("你好吗!");
    }

    这里扩展一下,为什么 if 后面跟 {

    而 函数 的 { 另起一行,这是 为了 突出 函数重要性,一看 { 就知道是 函数片段.

      2) . 关于for语句

    //第一种语法
    for(i = 0;i<10;++i)
        i*=2;
    
    //第二种写法
    for(i=0;i<10;++i){
       i*=2;
       printf("i=%d
    ",i);  
    }

    同样while语句也是这样写的.

      3).关于switch 语句

    switch(type){
    case 0:
      puts("hello ");
      break;
    
    case 1:
      puts("world ");
      break;  
    
    default:
      printf("type =%d fatal error!
    ",type);
      exit(EXIT_FAILURE);  
    }

    4)关于goto 语句

    //goto 使用方法,在项目较大的时候,还是必须要使用的
    
      for(int i=0;i<10;++i){
         for(int j=0;j<9;++j){
              if(i+j == 5)
                 goto __hl_puts;
          }
         ....
      }
    
    __hl_puts:
      puts("就这样");

    4.扩展总结

      到这里基本上关于C代码的书写基本就这样的,但也只是一个简单的开始.因为C的历史很悠久,悠久的历史中有过很多 天才创造出 优秀的范式.例Unix风格,Linux风格,Windows风格等等

    上面的范式主要还是Linux C开发风格.外加自己的一些简单理解.

        下面 再 说一些 其它,仅供参考.

    //全局变量声明
    int g_age = 10;
    
    //静态变量声明
    int __age = 20;
    
    //唯一宏判断
    #ifndef _H_ADD
    #define _H_ADD
    
    
    
    #endif /* !_H_ADD */

    写C代码原则就是 简单高效,最小意外原则.还有好多 话题 说 ,但是还是结束吧. 这些 都看 个人喜爱,和愿意投入到那个门派下吧.

    最后分享一个 例子 结束 关于C代码规范的分享.

    #include "sc_head.h"
    
    //将 数组 a[]中数据打乱,按照种子rk来打乱
    void swaps(int a[], int len, unsigned rk);
    //根据周数返回 索引
    int week_rand(void);
    
    //返回当前 周 和 下一个周的不变量 还有今天在星期的索引
    static int* __getwks(void)
    {
    #define _INT_WKS (7)
        //wks[0] 当前周种子,wks[1] 下周种子,wks[2] 当前星期数0表示周日,6表示周六
        static int wks[3];
    
        //先获取 当前 周 的周日 距离 这年开始 是多少天
        time_t t = time(NULL);
        struct tm *pt = localtime(&t);
        //1年的多少天
        int yd = pt->tm_yday;
        //今天是周几 [1,2,3,4,5,6,0]
        int wd = pt->tm_wday;
        //经历多少年了 从1900开始计算
        int year = pt->tm_year;
    
        //这周的不变量是 {一共经历的年数.当前年的周日的总天数} => 这天在历史上不变量
        wks[0] = year * 1000 + yd - wd + _INT_WKS;
    
        //继续获取 下一周的 周不变量
        wks[1] = wks[0] + _INT_WKS;
    
        //将其索引变成 [1,2,3,4,5,6,0] => [0,1,2,3,4,5,6]
        wks[2] = (wd + _INT_WKS - 1) % _INT_WKS;
    
    #undef _INT_WKS
    
        return wks;
    }
    
    /**********************************************************************
    $函数名:int main(int argc,char *argv[]);
    =>程序入口,主逻辑.
    
    #返回值:int
    
    @参数数:2
    =>int argc -> 传入的参数个数
    =>char *argv[] -> 参数集,字符表示
    ***********************************************************************/
    int main(int argc, char *argv[])
    {
        //初始化一些环境
        sh_start(true);
    
        //打印一条配置 配置见 sc_config.ini 文件
        CERR("%s", sc_get("heoo"));
    
        //开始 享受吧! pray
    
        int rk = 1;
        srand(rk);
    
        int i = 0;
    
        //测试通过
        for (;i< 10;++i)
            printf("%d, ",rand()%7);
        putchar('
    ');
    
        srand(rk);
        for (i=0;i < 10;++i)
            printf("%d, ", rand() % 7);
        putchar('
    ');
    
        return 0;
    }
    
    //将 数组 a[]中数据打乱,按照种子rk来打乱
    void
    swaps(int a[], int len, unsigned rk)
    {
        int i = -1;
        int idx, tmp;
    
        srand(rk);
        while (++i < len) {
            idx = rand() % len;
    
            tmp = a[i];
            a[i] = a[idx];
            a[idx] = tmp;
        }
    }
    
    //根据周数返回 索引
    int
    week_rand(void)
    {
        //原始数列
        int ws[] = { 1,2,3,4,5,6,7 }, nws[] = { 1,2,3,4,5,6,7 };
    
        //现在 我们 获取 了 这周的种子wkd 和 下周的种子nwkd
        int *wks = __getwks();
    
        //开始初始化
        swaps(ws, sizeof ws / sizeof *ws, wks[0]);
        swaps(nws, sizeof nws / sizeof *nws, wks[1]);
    
        //这里有个需要处理的情况 是这周 的 周日 和 下周的周一不能一样 .
    
        //如果一样 那么 只对这周处理 将这周日和周六交换
    
        if (ws[6] == nws[0]) {
            int tmp = ws[6];
            ws[6] = ws[5];
            ws[5] = tmp;
        }
    
        //返回结果
        return ws[wks[2]];
    }

    对了还有 C中预定义宏,也好复杂,这里不细说了.简单 说一点点

      #include <stdio.h> => 直接在 系统路径包含的路径下 找这个文件

          #include "sc_head.h" => 现在 当前文件路径下找,找不见去系统包含的路径下找

    对于#include 导入的头文件是不区分大小写的.

    欢迎交流,拍砖请轻拍,楼主怕伤着.O(∩_∩)O哈哈~

        

  • 相关阅读:
    ASP.NET 实现邮件发送和接受的功能(Sockets)
    使用Sql server进行分布式查询
    Sqlserver中的一些技巧
    使用sql server中的全文索引
    水晶报表的装载和修改文本
    创建作业的通用存储过程
    MS SQL数据库备份和恢复
    数据库运用XML操作
    安装程序自动安装数据库
    ASP.NET 实现邮件发送和接受的功能(Mail)
  • 原文地址:https://www.cnblogs.com/life2refuel/p/4946144.html
Copyright © 2011-2022 走看看