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.\n",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\n",i);
}

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

  3).关于switch 语句

switch(type){
case 0:
  puts("hello ");
  break;

case 1:
  puts("world ");
  break;  

default:
  printf("type =%d fatal error!\n",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(‘\n‘);

    srand(rk);
    for (i=0;i < 10;++i)
        printf("%d, ", rand() % 7);
    putchar(‘\n‘);

    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哈哈~

时间: 2024-08-24 15:12:15

C 的 一些写法格式 交流的相关文章

sql 写法注意点

a.CRUD(create,read,update,delete)操作方法写法格式 字段格式要个数据库表字段一致,字母不区分大小写,支持下划线. 例如: screenName or scrEenName = screenname(DB) no problem! screenName or scrEenName = screen_name(DB) no problem!

Android-风格和主题

Android-风格和主题 一 Style和主题Theme的区别 1,Theme是针对窗体级别的,改变窗体样式 2,Style是针对窗体元素级别的,改变指定控件或者Layout的样式 二 使用Style的方式 1,创建Style 在res/values下创建styles.xml文件 添加节点(根节点) 添加自定义的style和其属性: style的写法格式 <style name="MyStyle" parent="指定的父style" name前面不需要有a

黑马程序员(Java)----面向对象(上)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 面向对象 2.1了解面向对象 2.1.2 面向对象的概念 面向对象是相对面向过程而言,面向对象和面向过程都是一种思想.面向过程强调的是每一个功能的步骤,代表语言:C语言.面向对象强调的是对象,然后由对象去调用功能,代表语言:Java.C++.C#. 例子:把大象装进冰箱.用面向过程实现:1. 打开冰箱.2. 存储大象.3. 关上冰箱."打开"."存储"."

C++奇淫技巧,程序员为啥天天学继承与派生,真的有这么难吗

继承与派生 1.1继承与派生的概念 在C++中,可重用性是通过继承这一机制来实现的.所谓继承,就是在一个已存在的类的基础上建立一个新的类.已存在的类称为基类,新建立的类成为派生类.(与对象的复制做区别)一个新类从已有的类那里获得其已有特性,这种现象称为类的继承. C++奇淫技巧,程序员为啥天天学继承与派生,真的有这么难吗派生类继承了基类的所有数据成员和成员函数,并可以对成员作必要的增加或调整.创一个小群,供大家学习交流聊天如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交

内置对象

内置对象 1.Date var now = new Date(); 获取当前时间 now.toUTCString() 转化为字符串格式 now.getFullYear() 年 now.getMonth() 月要+1 now.getDate() 日 now.getDay() 一周的某一天 now.getHours() 时 now.getSeconds() 秒 now.getMinutes() 分 2.String var str = new String("abc"): var str

python基础篇【第二篇】

一.数据运算 举个例子一目了然就明白什么是运算符了:例子10+20=30,其中10,20为操作符 ,“+” 称为运算符. python支持支持的类型运算符有:算术运算.比较(关系)运算符.赋值运算符.逻辑运算符.位运算符.成员运算符.身份运算符.运算符优先级,下面我们一个个来看. 1.算数运算: 假设变量a=10,变量b=20: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相

算法实验:分治法合并排序(C++)

这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函

浅谈JSON.parse()、JSON.stringify()和eval()的作用

相信大家对于JSON应该不陌生,度娘对这个名词的解释大致如下: “JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集.因为采用独立于语言的文本格式,也使用了类似于C语言家族的习惯,拥有了这些特性使JSON成为理想的数据交换语言,作用是易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率).” 今天在这里笔者想简单谈谈jquery里面的JSON.parse()和JSON.stringify()函数,顺便

linux 系统防火墙知识学习

防火墙分为硬件的或者软件的防火墙两种.无论是在哪个网络中,工作于网络的边缘.我们的任务就是需要去定义到底防火墙安全策略.规则,以达到让它对出入网络的IP.数据进行检测.常见的有3.4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关. 1.iptables的工作机制 这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链. 1.PREROUTING (路由前) 2.INPUT (数据包流入口) 3.FORWARD (转发管卡) 4.OUTPUT(数据包出口