首页 > 编程语言 >001__C语言程序入门

001__C语言程序入门

时间:2024-06-06 15:35:40浏览次数:18  
标签:__ 函数 int C语言 001 printf 033 main man

一、第一个程序:hello world

配置部署好 vsCode 之后,就可以直接在上面写代码了,新建一个新的C程序文件,向屏幕输出一串字符 “Hello World!”

截图.png

下面,从整体上来分析一下这个最简单的C语言程序,将这个最简程序的各个部分剖析清楚,明白我们写下的每一个字符的具体含义。

二、C语言的基本结构

1、头文件

#include <stdio.h> // 告诉编译器在.h文件中(声明)有这么一个符号,你需要去其相应的.c文件里去找其源文件(实现(定义))

C语言程序中,任何符号(包括变量和函数)的使用,都是需要提前声明的。

如果程序用到了系统库函数,那么就需要包含相应的系统头文件来进行声明。

上述代码中用到库函数printf,而这个函数的声明在头文件 stdio.h 中,因此在该程序中需要包含此头文件。

声明

概念:对源文件外定义的某个符号进行描述的过程,称为声明

作用:经过声明的符号,编译器才能正确识别和编译,否则编译器不认识,无法判定语法错误

符号:变量、函数等

示例:

// 声明一个变量符号number

extern int number;

// 声明一个函数符号function

extern void function(int size, char *buf);

// 注意:前面的extern的关键字是可以不加的

2、主函数

主函数是必须有的,每一个C语言程序都有main函数,哪怕是空的。

主函数的名字是固定的,叫 main ,这个函数名不可被挪作他用。

主函数是程序的入口,也就是程序开始运行的地方。

主函数分解如下:

// int: 返回值类型,代表主函数最终的执行结果是一个整型数据

// main: main是函数名,这个名字不能变

// void: 是函数参数列表,可以省略,表示空的意思,就是没有参数的意思

int main(void)
{
 ........
}
在 Linux 环境下,主函数 main 根据程序最终是否需要接收外部命令行参数,实际上有两个版本:

// 不接收外部命令行参数的版本
int main(void)
{
 ...
}
// 接收外部命令行参数的版本
int main(int argc, char **argv)
{
 ...
}

 

3、printf函数

C语言被称为是一种面向过程的模块化语言,所谓的模块,指得是一个个功能明确、各司其职的封装函数,它们就像一块块积木,被合理有机地拼搭起来,形成复杂、健壮的程序。

在这之中,系统标准C库提供了非常多“模块”,printf 就是其中之一,它的功能就是:向终端输出一段指定格式的数据。

// 向终端输出一段字符串

printf("Hello World!\n");

a、格式输出控制符

概念:函数 printf 被称为格式化IO函数,因为它是按照指定格式来操作数据的。以常见的整数、浮点数和字符串为例,

printf 函数相关的控制格式符如下所示:

// 头文件
#include <stdio.h>

// 主函数
int main(void)  
{
    // 1、没有格式控制符的printf函数
    printf("hello world!\n");

    // 2、打印整型数
    int num1 = 100;
    printf("num1(10进制) = %d \n", num1);

    // 3、打印八进制数
    int num2 = 100;
    printf("num2(8进制)  = %o \n", num2);

    // 4、打印十六进制数
    int num3 = 100;
    printf("num3(16进制) = %x \n", num3);

    // 5、打印字符
    char ch1 = 'a';
    int  ch2 = 100;
    printf("ch1 = %d \n", ch1);                         // 打印出对应的ascll码表的数值
    printf("ch2 = %c \n", ch2);                         // 打印的是asccll码表数值对应的字符

    // 6、打印字符串(一串字符,后面加'\0')
    char *buf1      = "shijienameda,woxiangqukankan!";   // 指针buf1存放了字符串的首字符的地址('s'的地址)
    char buf2[128]  = "nihao,woshiniqingge";             // 数组buf2存放了字符串里的所有字符
    printf("buf1 = %s \n", buf1);                        // printf函数从buf1存放的地址,跳到常量区里的字符串,将其字符打印出来,一直到遇到'\0'为止                    
    printf("buf2 = %s \n", buf2);                        // 直接打印buf里的内容,知道遇到'\0'为止

    // 7、打印单精度浮点型数
    float f1  = 3.14;                                    // 小数3.14默认在系统中以double数据类型(默认64位系统,64位精度值)来存储
    printf("f1 = %f \n", f1);                            // 如果你用float型来存放小数3.14,它只存放32的精度值

    // 8、打印双精度浮点型数
    double f2 = 3.14;
    printf("f2 = %lf \n", f2);  

    if (f1 == 3.14) // if(f1 == f2)                      // 这里之所以不相等,是因为两个比较的数,其精度不一致
    {
        printf("f1等于f2!\n");
    }
    else
    {
         printf("f1不等于f2!\n");
    }

    // 9、打印地址
    printf("num1 = %p\n", num1);                        // 里面存放的数值为十进制100,打印的时候将其以16进制方式打印出来为0x64(地址是以十六进制的方式打印出来的)
    printf("num1 = %p\n", &num1);                       // 存放数值100的num1变量的地址
    return 0;

}

b、语法点:

类似 %d、%f 被称为格式控制符

一个格式控制符对应一个数据

‘\n’ 是一个字符,表示回车符,详细可见ASCII 码表。

c、常见的格式控制符:

基础格式控制:

%d//十进制整数

%o//八进制整数

%x //十六进制整数

%c//字符:

%s//字符串:

%f//单精度浮点数:

%lf//双精度浮点数:

%p//输出地址、输出指针的值

 

格式控制拓展(后面讲):

.........

d、常见的printf函数常见显示特效

一、背景色、字体色显示

a、格式:\033[40-47;30-37m

b、说明:

40/30: 黑色(背景色/字体色)

41/31: 红色

42/32: 绿色

43/33: 黄色

44/34: 蓝色

45/35: 紫色

46/36: 深绿色

47/37: 白色

c、使用:

printf("\033[40;32m《医疗挂号信息管理系统》\n");

 

二、显示效果

\033[0m // 关闭特效

\033[1m // 高亮效果

\033[4m // 下划线效果

\033[5m // 闪烁效果

\033[7m // 反显(交换前景色和背景色)

\033[8m // 消隐(文本不可见)

 

 

三、光标设置

\033[2J // 清除屏幕

\033[x;yH // 定位光标(x:横轴坐标, y:纵轴坐标)

\033[yA // 上移光标(y是纵轴移动的位置)

\033[yB // 下移光标

\033[xC // 右移光标(x是横轴移动的位置)

\033[xD // 左移光标

\033[H // 复位光标

\033[?25l // 隐藏光标

\033[?25h // 显示光标

\033[u // 恢复光标位置

\033[s // 保存光标位置

\033[K // 清除从光标到行尾的内容

4、return语句

C语言中的关键字 return 的含义是结束一个函数,并返回某个数据(若有)。而具体到 main 函数中时,由于主函数 main 的结束同时也意味着整个程序的结束,因此在上述 Hello World 程序中 return 后整个程序就退出了。

int main()
{
 ... ...
 // 一般而言,函数正常退出返回0,非正常退出返回非0
 return 0;
}

一般而言,程序正常退出时,main函数返回值是0;当程序异常退出时,main函数返回值是非0。

注意,main函数的返回值是给上一级进程的,因此理论上讲在当前的单进程程序中,main函数的返回值究竟是多少都无所谓,因为根本没有去使用这个返回值,除非在多进程程序中,进程间才需要使用main函数的返回值来传递信息。

三、man帮助手册、在线文档*****

1、man手册(manual:手动的)

编程开发的过程中,需要使用众多的系统指令、各类函数库、系统调用、各类系统脚本文件等,这些种类繁多、功能各异的信息,可以通过统一的man手册来获取第一手资料,man文档是帮助信息的权威通道,是大多数教程、书籍的知识来源。

由于 man 手册所需要罗列的帮助条目众多,因此 man 手册被妥善地分为9册,不同的帮助信息被放入对应的man分册中:

在ubuntu命令行中敲::

man man

 

image.png

man文档的九个分册:

可执行程序或Shell命令(默认已安装)

系统调用 (Linux内核自带的函数)

库函数 (外部的第三方函数)

特殊文件(通常出现在/dev目录下)

文件的特殊格式或协定(例如/etc/passwd的格式)

游戏

杂项(例如一些宏定义)

系统管理员命令(通常只能由管理员执行)

非标准内核例程

a、man手册的安装

在默认情况下,系统只安装第一册,其他的帮助信息一般需要用户自己手动安装,安装指令如下:

gec@ubuntu:~$ sudo apt install manpages

gec@ubuntu:~$ sudo apt install manpages-dev

b、man手册的查询

使用man手册查询命令、函数时,一般直接在man后面接上待查条目即可,但有时候会遇到同一个待查询的条目存在于多个man分册的情况,这就需要先罗列出该条目所在的分册信息,然后再根据需要去选择帮助文档的序号。

1、查询单一分册的条目:

gec@ubuntu:~$ man strcpy

 

2、查询存在于多个分册的条目:

# 先使用 -f 来查看有哪些分册包含了该条目

gec@ubuntu:~$ man -f printf

printf (1) - format and print data

printf (3) - print formatted output

 

# 根据需要,指定查询某一册帮助分册

gec@ubuntu:~$ man 3 printf

2、在线文档(C/C++)

https://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5

 

四、代码风格规范

1、标识符命名:

只能包含数字、字母以及下划线,不能包含其他任何特殊字符。

只能以字母或者下划线开头。

不能跟系统已有的关键字重名,也不能跟本命名空间(namespace)中具有相同作用域的其他标识符重名。

尽量能一望便知,做到顾名思义,避免使用无意义字符

通常的命名方式(推荐):

a、函数名:

驼峰命名法: FangHuiQing

下划线命名法: fang_hui_qing

二合一法: Fang_Hui_Qing或Fang_HuiQing

 

b、变量名:

 int led_num = 0; // 下划线命名法,小写

 int led_flag = 0;

 

c、宏定义:

 #define LED_ON // 下划线命名法,大写

 

2、缩进:凡是有代码块的地方都必须缩进,一对大括号 { } 代表一个代码块

3、空格:标点符号后面,一般加空格

4、空行:不同逻辑段落中间,一般加空行

5、示例代码:

#include <stdio.h>

int num = 1000;                                        // 全局变量是另一个作用域,可以(注意:不同作用域,变量名相同,会优先使用最近的作用域)
// 5、凡是有代码块的地方都必须缩进,一对大括号 { } 代表一个代码块
// 普通函数(初始化LED灯)
void LED_Init(void)
{
    int led_num1 = 1;
    int led_num2 = 1;
    printf("LED Init\n");                               // 这是一个代码块,不要贴墙,要有缩进(一个tab键(建议), 或者4个空格(太麻烦))

     // 6、不同逻辑段落中间,一般加空行
    led_num1 = 0;
    led_num2 = 0;
    printf("LED UnInit\n");                            
}
// 普通函数(比较大小)
int Max_OfTwoValue(int a, int b)
{                      
   return a>b ?a:b;                              
}
// 主函数
int main(int argc, char const *argv[])
{
    // 1、- 只能包含数字、字母以及下划线,不能包含其他任何特殊字符。
    int give_you_little_color_to_see_see_100000 = 100;  // 可以
    // int aaa_111_&&& = 200;                           // 不可以

    // 2、只能以字母或者下划线开头
    int _______nihao888 = 300;                          // 可以
    int nihao888______  = 400;                          // 可以
    // int 888nihao______  = 500;                       // 不可以

    // 3、不能跟系统已有的关键字重名,也不能跟本命名空间(namespace)中具有相同作用域的其他标识符重名
    // int int = 600;                                   // 不可以
    int    num = 700;                                   // 可以
    // int num = 800;                                   // 同一命名区,再写了一个num,不可以
    {
        int num = 900;                                  // 使用{}括起来的,就是另外一个作用域,可以
        printf("num = %d\n", num);
    }
    printf("num = %d\n", num);

    // 4、尽量能一望便知,做到顾名思义,避免使用无意义字符
    int long_time_no_see    = 1100;                     // 英文、中式英文也是可以的,能望文生义即可
    int fanggongnizhenshuai = 1200;                     // 拼音不行,会有歧义(比如:方工你真帅!!!(方工你真衰!!!) )


    // 5、6
    LED_Init();

    // 7、标点符号后面,一般加空格
    int a   = 1300;
    int b   = 1400;
    int max = 0;

    max = Max_OfTwoValue(a, b);
    printf("max = %d\n", max);
    return 0;

}

 

标签:__,函数,int,C语言,001,printf,033,main,man
From: https://www.cnblogs.com/KanGIaJee/p/18235162

相关文章

  • 2道寻找回文子串的题目
    题目题目1题目2题目1是将字符串分隔,使得分隔后得到的每个字符串都是回文子串题目2是从字符串里面找到回文子串两道题都可以利用递归来解决//利用双指针判断是否是回文子串boolisre(string&s){ intleft=0; intright-s.size()-1; while(left<=right) {......
  • Spring Boot 不能加载 tcnative-2.dll 库(Can't load library: tcnative-2.dll)
    SpringBoot不能加载tcnative-2.dll库本文将介绍怎样解决SpringBoot在启动时抛出“org.apache.tomcat.jni.LibraryNotFoundError:Can'tloadlibrary:*\tcnative-2.dll”错误。在使用SpringBoot3创建项目的过程中,将日志的级别调为debug,日志打印了“org.apache.tomca......
  • BUG:驱动新屏幕,屏幕左右无法居中
    1.BUG描述RGB屏幕的显示左右无法居中2.BUG原因因为屏幕参考值的前肩距和后肩距(Hfp、Hbp)的type值远远超出了芯片的限制(32、128)。所以造成左右偏移无法调节。3.修复方法最后将屏幕的SYNC模式,硬件重新接线改为DE模式。使得前间距和后间距不再有效。4.补充4.1参数的计算......
  • 【Python机器学习】无监督学习——不同类型的预处理
    之前学习过,一些算法(比如神经网络和SVM)对数据缩放非常敏感。因此,通常的做法是对特征进行调节,使数据更适合于这些算法。通常来说,这是对数据的一种简单的按照特征的缩放和移动。举例:importmglearn.plotsimportmatplotlib.pyplotaspltmglearn.plots.plot_scaling()plt.sh......
  • chatglm4 多显卡部署
    importtorchfromtransformersimportAutoModelForCausalLM,AutoTokenizerimportosos.environ['HF_ENDPOINT']='https://hf-mirror.com'#加上这行之后又恢复以前的速度了!device="cuda"print("是否可用:",torch.cuda.is_available())......
  • 蓝卓煤炭行业解决方案
    煤炭是能源保障的“压舱石”,无论是发电、建材、造纸、冶金、化工等工业领域都离不开煤炭。近年来,在“双碳”及能源安全双重背景下,推动智能化技术与煤炭产业的融合发展,提升煤矿安全生产能力的重要性与日俱增,智慧矿山的建设已逐渐成为推动行业发展的必经之路。围绕3大方向,打......
  • oop-PTA题目集4~6总结
    一、前言   相比于前三次的题目集,题目集4~6需要用到的新的知识点主要是面向对象程序设计中继承和多态这两个特性的使用。第四次题目集中的答题判题程序-4是在前三次程序的基础上增加新的内容,新增了选择题和填空题两种题型,这一变化的处理需要用到前三次未使用的继承,即将题目......
  • SpringBoot启动流程分析之准备应用上下文refreshContext()(八)
    SpringBoot启动流程分析之准备应用上下文refreshContext()(八)文章目录SpringBoot启动流程分析之准备应用上下文refreshContext()(八)1、准备刷新1.1、子类prepareRefresh()方法1.2父类prepareRefresh()方法2、通知子类刷新内部bean工厂3、准备bean工厂4、允许上下文子类对b......
  • Informer复现+实现自己的数据集
    笔记简介笔记:记录一下实现Informer时序预测的过程,同时加注一些要点,并加上构建自己数据集进行预测的过程。内容:1、Informer论文解读、复现2、构建自己的数据集3、利用Informer对数据集进行预测一、Informer论文摘要:许多实际应用需要长序列时间序列的预测,例如电力消耗计......
  • 2种方法解决需要clik点击数的题目——[HNCTF 2022 WEEK2]getflag 137分 MFC patch RE
    题目   DIEIDA找到判断点击数的if,我们修改一下汇编指令让点击数<99999999就成立这个程序没有要求我们输入,说明flag是程序打印的IDA动调 下一个断点修改 得到flag  还有一种更快的方法——CheatEngine 随便点击几次 在CE中修改点击次数 Getf......