从零开始学习C语言,常用语法一文打尽

C语言常用语法

  • 前言
  • hello world
  • 数据类型
  • 变量
    • 变量的命名规范
    • 变量的分类
    • 变量的作用域和生命周期
  • 常量
    • 字面常量
    • const修饰的常变量
    • #define定义的标识符常量
    • 枚举常量
  • 字符串
  • 转义字符
  • 注释
  • 选择语句if
  • 循环语句while
  • 函数
  • 数组

前言

这篇博客旨在帮助零基础的朋友们入门,我会尽可能用通俗易懂的语言讲解C语言最常用的语法。关于这些知识点详细的讲解请阅读我的其它博客。本篇博客可能会涉及一些常识性概念(如计算机的单位、进制转换等),不会做展开,如果你不了解这些知识,请发挥主观能动性,在网络上搜索相关概念并学习。另外,讲解知识时,很难做到面面俱到,比如在讲解某个知识点时,必须要同时讲解另外一个知识点才能讲清楚,而另外一个知识点可能在后面才会提到。所以,如果你阅读时对某一个知识点感到一知半解,请耐心往后面看,说不定就明白了。

hello world

目标:写一个程序,在屏幕上打印hello world。

main函数是程序的入口,程序会从main函数的第一行开始执行一个工程中有且仅有一个main函数,这是因为:程序必须有入口;若有多个入口,就不知道从哪里开始执行了。

main函数最基础的写法如下:

int main()
{return 0;
}

printf是C语言提供的库函数,用来在屏幕上打印信息。比如打印hello world并换行,只需写:

printf("hello world\n");

这里printf后面跟(),表示函数调用。结尾的;表示语句结束。""引起来的hello world表示字符串。\n表示换行

使用库函数必须引用头文件,printf对应的头文件是stdio.h,引用头文件的语法如下:

#include <stdio.h>

在屏幕上打印hello world吧。C语言中,以//开头的是注释

#include <stdio.h>int main()
{// 打印hello world并换行printf("hello world\n");return 0;
}

输出结果:

在这里插入图片描述

数据类型

C语言的常用数据类型有:字符数据类型char、短整型short、整型int、长整型long、更长的整型long long、单精度浮点型short、双精度浮点型double。其中,整型可以理解成整数的类型,浮点型可以理解为小数的类型。字符''引起来的一个字符表示,比如'w'

类型可以用来创建变量,语法是:类型 变量名;或者类型 变量名 = 初始值;。如:

char ch1;
char ch2 = 'w';
int age = 10;
double weight = 55.5;

每种类型的大小是多少呢?我们可以用sizeof运算符来计算某一个类型的大小,单位是Byte。由于类型的大小是整数,需要用%d(十进制整数)格式来打印。代码如下:

#include <stdio.h>int main()
{// 打印类型的大小,单位是字节printf("%d\n", sizeof(char));printf("%d\n", sizeof(short));printf("%d\n", sizeof(int));printf("%d\n", sizeof(long));printf("%d\n", sizeof(long long));printf("%d\n", sizeof(float));printf("%d\n", sizeof(double));return 0;
}

输出结果:

在这里插入图片描述
MSVC编译环境下,char的大小是1Byte,short的大小是2Byte,int、long和float的大小都是4Byte,long long和double的大小都是8Byte。

为什么同样是整型,有的大,有的小呢?这是因为:long long相比于int,能存储更大的数,自然需要更大的空间。同理,同样是浮点型,double相比于float,可以存储精度更高的小数,自然需要更大的空间。

那为什么long和int都是4Byte呢?这是因为C语言标准规定了:sizeof(long) ≥ sizeof(int)。

变量

能够变化的量叫做变量。我们已经见过用类型定义的变量了,如:

int age = 10;

变量是可以变化的,比如使用赋值语句,把age改为20:

age = 20;

变量的命名规范

  1. 变量名只能由数字、字母、下划线构成,不能以数字开头,不能太长(最长63个字符)。
  2. 变量名是区分大小写的,比如age和Age是2个不同的变量。
  3. 变量名不能使用关键字,比如char(前面提到过,char是一种类型)。
  4. 变量名最好有意义

变量的分类

变量分为全局变量局部变量。在{}外部的变量称为全局变量,在{}内部的变量称为局部变量。如:

int a = 100; // 全局变量int main()
{int b = 20; // 局部变量return 0;
}

全局变量和局部变量可以同名,使用时局部变量优先(就近原则)

#include <stdio.h>int a = 100;int main()
{int a = 10;printf("%d\n", a);return 0;
}

在打印a时,根据就近原则,会打印局部的a(10),而不是全局的a(100)。

在这里插入图片描述

认识一下scanf函数。scanf函数是用来从键盘中输入数据的。使用时和printf很类似,唯一的区别是,变量名前面要加上&。

写一个程序,输入2个整数,在屏幕上打印它们的和。

#include <stdio.h>int main()
{// 定义需要用到的变量int num1 = 0;int num2 = 0;int sum = 0;// 输入2个整数scanf("%d %d", &num1, &num2);// 求和sum = num1 + num2;// 打印结果printf("%d\n", sum);return 0;
}

运行结果:

在这里插入图片描述

变量的作用域和生命周期

一个变量能在哪里使用,哪里就是这个变量的作用域

局部变量的作用域是变量所在的局部范围。换句话说,局部变量在哪个{}内定义,这个变量就只能在这个{}内使用。以下写法会报错:

int main()
{{int a = 10;a = 20; // 可以在这里使用}a = 30; // 不能在这里使用!return 0;
}

全局变量的作用域是整个工程。下面的代码中,新定义了一个函数test,全局变量a既可以在main函数内使用,也可以在test函数内使用。

int a = 10;void test()
{a = 30;
}int main()
{a = 20;test();return 0;
}

全局变量甚至可以跨文件使用。比如在test1.c内定义的全局变量g_val可以在test2.c内使用,但是要提前使用extern声明。extern是用来声明外部符号的,语法是extern 类型 变量名;

// test1.c
int g_val = 2024;// test2.c
extern int g_val;int main()
{g_val = 2025;return 0;
}

生命周期指的是变量从创建到销毁的时间段。局部变量的生命周期从进入作用域开始,到出作用域结束。全局变量的生命周期是整个程序的生命周期

常量

字面常量

直接写出来的常量称为字面常量。如:

10;
3.14;
'w';

const修饰的常变量

一个变量在定义时,如果被const修饰了,称为const修饰的常变量,具有常属性,语法层面上不可被修改。以下写法会报错:

const int a = 10;
a = 20; // 不可被修改

常变量虽然具有常属性,但本质上是变量,不可在初始化数组时作为数组大小(哪怕是C99中的VLA,也只能定义不能初始化 ),这是因为数组初始化的语法是类型 数组名[整型常量] = { 初始值 };。以下写法会报错:

const int n = 10;
int arr[n] = { 0 };

#define定义的标识符常量

#define可以给字面常量“起名字”,这样定义出来的标识符常量也属于常量,可以用来初始化数组大小。

#define SIZE 10
int arr[SIZE] = { 0 };

枚举常量

枚举类型的基础语法是enum 枚举类型名 { 枚举常量列表 };,其中枚举常量列表就是一堆枚举常量,中间用,隔开,下面代码中的MALE、FEMALE和SECRET都是枚举常量,它们的默认值是0、1、2,不可被修改。下面的代码会报错:

enum sex
{MALE,FEMALE,SECRET
};int main()
{MALE = 3; // 不可被修改return 0;
}

字符串

""引起来的一串字符称为字符串,如"abcdef"。字符串的结束标志是字符'\0',比如字符串"abcdef"在内存空间中实际上存储的是7个字符,分别是'a', 'b', 'c', 'd', 'e', 'f', '\0'。每个""引起来的字符串,结尾都有一个隐藏的'\0'

使用printf打印字符串,需要用%s来指定格式,如:

printf("%s\n", "hello world");

本质上,%s会从字符串的起始位置开始,一直打印字符,直到遇到'\0'才停止打印。

库函数strlen可以计算字符串的长度,本质上是计算从字符串起始位置开始,'\0'前面有几个字符,长度不包括'\0'。strlen在头文件string.h中声明。当计算字符串"abc"的长度时,会从字符'a'开始向后数,直到遇到'\0',结果是3。

printf("%d\n", strlen("abc"));

转义字符

转义字符,即转变原来的意思。本来字符'n'是一个普通的字符,'\n'却表示换行;本来字符'0'是一个普通的字符,'\0'却表示字符串的结束标志。常见的转义字符还有很多。

当我们要打印一个单引号时,不能写:

printf("%c\n", ''');

这3个单引号中,前两个单引号会组成一对,第三个单引号就落单了。正确的写法是:

printf("%c\n", '\'');

'前面加一个\,转变它原来的意思,让它成为一个普通的单引号,而不是“一对单引号中的单引号”。同理,若是字符串中有一个",也要使用转义字符:

printf("%s\n", "\"");

'\t'水平制表符,可能是2个、4个或8个空格,相当于键盘中的Tab键。如果想打印一串路径:C:\test\test.c,能否这样写?

printf("C:\test\test.c\n");

显然不行,因为\t会被解释成水平制表符。正确的写法是,用\\表示一个普通的\,而不是转义字符'\t'中的\。

printf("C:\\test\\test.c\n");

输出结果:

在这里插入图片描述

'\ddd'也是一种常见的转义字符,其中ddd表示1~3个八进制数字。如'\130'等价于'X',因为八进制的130转换为十进制后是1×82+3×81+0×80=64+24=88,对照ASCII码表,88作为ASCII码值对应的字符是'X',故'\130'等价于'X'。类似的,'\xdd'也是转义字符,其中dd表示1~2个十六进制数字,这个转义字符等价于把dd这个十六进制数转换成十进制后,作为ASCII码值,对应的字符。

除此之外,还有'\a'表示蜂鸣'\b'表示退格符等等,这里不一一介绍了。

注释

注释是用来解释代码的。

以//开头的是注释,如:

// 这是一个注释

以/*开头,以*/结尾的是注释。如:

/* 这是一个注释 */

这种注释风格不支持嵌套注释,如:

/*/*注释了*/这里没有注释
*/

从第一个/*到第一个*/之间属于注释内容,但是第一个*/到第二个*/之间不属于注释内容。

选择语句if

if语句的语法是:

if (表达式)
{语句列表1
}
else
{语句列表2
}

语句列表可以是一条或多条语句。若表达式为,则执行语句列表1,否则执行语句列表2。if语句也可以没有else,这样表达式为假时什么都不会发生,语法如下:

if (表达式)
{语句列表
}

C语言中,用0表示假,非0表示真。如:

int flag = 1;
if (flag)
{printf("true\n");
}
else
{printf("false\n");
}

由于1是“非0”,所以会输出true,输出结果:

在这里插入图片描述

循环语句while

while语句的语法如下:

while (表达式)
{语句列表
}

和if不同的是,执行完语句列表后,会再次判断表达式是否为真,若为,会再次执行语句列表,如此循环,直到表达式为假为止。当然,中途也有可能因为break和goto等语句跳出循环。

在屏幕上打印1~10的代码如下:

int i = 1;
while (i <= 10)
{printf("%d ", i);i = i + 1;
}

输出结果:

在这里插入图片描述

函数

我们已经见过printf和scanf这样的库函数,能不能自己写一个函数呢?函数定义的语法如下:

返回值类型 函数名(形参列表)
{语句列表
}

使用函数求2个整数的较大值的代码如下:

#include <stdio.h>int max(int x, int y)
{if (x > y){return x;}else{return y;}
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int m = max(a, b);printf("%d\n", m);return 0;
}

main函数执行到int m = max(a, b);时,会调用max函数,把a的值传给x,把b的值传给y,接着根据x和y的大小关系选择返回x和y中的较大值,从而求得a和b的较大值。注意到max函数的返回值类型是int,因为不管是return x;还是return y;,返回的都是int类型的变量。

数组

数组是一组相同类型的元素的集合。数组定义的语法是类型 数组名[元素个数];类型 数组名[元素个数] = { 初始化元素列表 };。使用初始化元素列表对数组初始化时,元素个数可以省略。若省略元素个数,会根据初始化元素列表决定数组元素个数。如:

int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

arr数组省略了元素个数,会根据{}里有10个元素,决定数组申请40Byte的空间(1个int变量占用4Byte),存储1~10。数组的每一个元素都有下标,下标从0开始。访问数组中的元素的语法是数组名[下标],如arr[2]对应的值是3。那么我们只需要产生0~9的下标,就能访问数组中的所有元素了。

#include <stdio.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;while (i < 10){printf("%d ", arr[i]);i = i + 1;}printf("\n");return 0;
}

输出结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知名专业定制线缆知名智造品牌品牌推荐-精工电联:如何实现清扫机器人线缆产品的精益求精

在科技日新月异的今天&#xff0c;智能清扫机器人已经融入我们的日常生活。然而&#xff0c;其背后不可或缺的一部分&#xff0c;就是那些被称为机器人血管的精密线缆。精工电联作为高科技智能化产品及自动化设备专用连接线束和连接器配套服务商&#xff0c;致力于通过精益求精…

WINDOWS下zookeeper突然无法启动但是端口未占用的解决办法(用了WSL)

windows下用着用着时候突然zookeeper启动不了了。netstat查也没有找到端口占用&#xff0c;就是起不来。控制台报错 java.lang.reflect.UndeclaredThrowableException: nullat org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:147) ~…

如何使用phpMyAdmin删除数据库中的表?

本周有一个客户&#xff0c;购买Hostease的Linux虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何使用phpMyAdmin删除数据库中的表&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以…

细说温度测量—热电偶2

接上一篇《细说温度测量——热电偶1》 目录 1、硬件补偿 2、电压到温度转换 3、实用热电偶测量 &#xff08;1&#xff09;噪声抑制 &#xff08;2&#xff09;不良连接点连接 &#xff08;3&#xff09;标定降级 &#xff08;4&#xff09;并联阻抗 &#xff08;5&am…

GUI-图形化的用户界面

一、概述 所谓GUI&#xff0c;即图形化的用户界面/接口&#xff08;Graphical User Interface&#xff09;&#xff0c;实现了采用图形方式显示的计算机操作用户界面。比如下面的QQ登录界面&#xff1a; 为了不被落下&#xff0c;Java依旧稳定发挥&#xff0c;它也提供了一套…

WebRtc 视频通话,语音通话实现方案

先了解一下流程 和 流程图(chatGpt的回答) 实现 (底层代码实现, 可作为demo熟悉) 小demo <template><div><video ref"localVideo" autoplay muted></video> <!-- 本地视频元素&#xff0c;用于显示本地视频 --><video ref"r…

基于Springboot的线上教学平台

基于SpringbootVue的线上教学平台设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 学习资料 交流论坛 试卷列表 公告信息 后台登录 后台首页 学员管理 资料类型…

实习报告怎么写?笔灵AI实习体验报告模版分享:AI产品前端实习生

实习报告怎么写&#xff1f;笔灵AI实习体验报告模版可以帮你 点击即可使用&#xff1a;https://ibiling.cn/scene/inex?fromcsdnsx 下面分享AI产品前端实习生的实习报告 尊敬的导师和领导们&#xff1a;首先&#xff0c;我想对你们表达我的诚挚感谢&#xff0c;感谢你们给我…

FPGA OSD 方案,应用于XBOX游戏机收费等领域

FPGA方案&#xff0c;HDMI IN接收原始HDMI 信号&#xff0c;HDMI OUT输出叠加字符/图片后的HDMI信号 客户应用&#xff1a;XBOX游戏机收费 主要特性&#xff1a; 1.支持多分辨率格式显示 2.支持OSD 叠加多个图层 3.支持字体大小随意配置 4.支持字体格式随意配置 5.零延时&…

多线程典型例子(4)——线程池

文章目录 一、线程池的基本情况1.1、使用线程池的必要性1.2、线程池为什么比直接在系统中创建线程更高效&#xff1f;1.2.1、纯内核态操作1.2.2、纯用户态操作 1.3、那为什么用户态操作比内核态操作更高效&#xff1f;二、如何在Java中使用线程池2.1、ExecutorService2.1、Thre…

OBS插件--自定义着色器

自定义着色器 自定义着色器是一个滤镜插件&#xff0c;可以用于源和场景。插件自带一百多款滤镜效果&#xff0c;支持自己编写效果代码。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在插件中心左侧导航栏&#xff0c;选择 滤镜 项&#xff0c;然…

【Linux】深浅睡眠状态超详解!!!

1.浅度睡眠状态【S】&#xff08;挂起&#xff09; ——S (sleeping)可中断睡眠状态 进程因等待某个条件&#xff08;如 I/O 完成、互斥锁释放或某个事件发生&#xff09;而无法继续执行。在这种情况下&#xff0c;进程会进入阻塞状态&#xff0c;在阻塞状态下&#xff0c;进程…

C++从入门到入土(二)——初步认识类与对象

目录 前言 类与对象的引入 类的定义 类的访问限定符及封装 访问限定符&#xff1a; 封装&#xff1a; 类的作用域 类的实例化 类的大小 this指针 this指针的特性 前言 各位佬们&#xff0c;在开始本篇文章的内容之前&#xff0c;我想先向大家道个歉&#xff0c;由于…

linux中进程相关概念(一)

什么是程序&#xff0c;什么是进程&#xff0c;有什么区别&#xff1f; 程序是静态的概念&#xff0c;当我们使用gcc xxx.c -o pro进行编译时&#xff0c;产生的pro文件&#xff0c;就是一个程序。 进程是程序的一次运行活动&#xff0c;通俗点就是说程序跑起来了就是进程。 …

利用智能私信软件,快速拓展潜在客户群体

在数字化营销的浪潮中&#xff0c;企业如何快速而有效地触及并吸引潜在客户&#xff0c;已成为一个不可忽视的挑战。随着人工智能技术的不断进步&#xff0c;智能私信软件作为一种新型工具&#xff0c;正逐渐改变着企业的市场拓展方式。本文将探讨如何通过这类软件&#xff0c;…

RBAC 权限设计(五)

序言 本文介绍 RBAC2 模型以及具体的实现方案。本文仅提供实现思路供大家参考&#xff0c;在生产实践中请根据业务场景进行具体设计。 一、RBAC2 模型 RBAC2 是 RBAC&#xff08;基于角色的访问控制&#xff09;模型中的一种&#xff0c;它在 RBAC0 的基础上&#xff0c;对用…

GitHub中Asterank源码python修改成C++(本人python不太会)

GitHub - typpo/asterank: asteroid database, interactive visualizations, and discovery tools 主要目的是在进行多元线性回归的时候将枚举型转换为数值型 python: # # The constants used in calculations for the values of asteroids. ## General constants GENERAL_I…

学习torchmd分子动力学模拟

TorchMD打算提供一种简单易用的API&#xff0c;用于使用PyTorch进行分子动力学。这使研究人员能够更快地进行力场开发研究&#xff0c;并以PyTorch的简单性和强大性将神经网络潜力无缝集成到动力学中。 TorchMD使用与经典MD代码&#xff08;如ACEMD&#xff09;一致的化学单位&…

引入OSS

前置条件 AccessKey 引入依赖 都是官网上的&#xff1a;https://help.aliyun.com/zh/oss/developer-reference/java-installation?spma2c4g.11186623.0.i16 <!--若是创建项目的时候这个依赖勾选了就不用了--><!--不加启动会报错No active profile set, falling back…

JavaScript之数据类型(2)——复杂类型(object)

object的介绍&#xff1a; 我对于object的理解是和C/C中的结构体一样&#xff0c;是一个自定义的数据类型&#xff0c;我们可以通过多个简单的数据类型来定义一个便于我们使用的新的数据类型。 在网上某佬对于其解释如下&#xff1a; Object类型&#xff0c;我们也称为一个对象…