零基础学C语言——表达式和语句

news2025/2/5 22:00:25

这是一个C语言系列文章,如果是初学者的话,建议先行阅读之前的文章。笔者也会按照章节顺序发布。

在这里插入图片描述
在上一篇的示例中其实出现过很多表达式和语句,例如:

int a = 1 + 2;

其中,1 + 2是一个表达式, a = 1 + 2也是一个表达式, 而整个这句则是一个语句。

表达式

**表达式是一种由运算符和操作数组成的结构。**下面我们看一些表达式例子:

1 + 2 //加号为加法运算符,1和2为加法运算符相关的操作数

2 >> 1 //>>为右移运算符,2和1为运算符相关的操作数

func(1,2) //这是一个函数调用,初学者可以暂时不考虑什么是函数,我们将在后面介绍
//在这个例子中,可以将函数名与()看作运算符,而括号内的数为操作数。
//大家可以回看上一篇中运算符表中的括号运算符的使用形式。

每一个表达式都有一个表达式值

例如1 + 2,我们都知道等于3,3就是这个加法表达式的值。

再例如2 >> 1,我们也知道等于1,1就是这个右移表达式的值。

最后看下func(1,2)这样的表达式,它的值是函数func的返回值,初学者不必纠结于此。

上一篇我们介绍的运算符中有一个自加和自减的运算符,我们来看下例子:

int a = 10;
//下面这四个表达式的值和变量a的值分别是多少呢
++a //a的值11,表达式值11
a++ //a的值11,表达式值10
--a //a的值9,表达式值9
a-- //a的值9,表达式值10

可以看到,凡是自加/自减运算符在前的,a的值和表达式的值都是经过运算后的值,而运算符在后的,a的值是运算后的值,表达式的值则是运算前的值。

再来看一个上一篇的例子:

int a = (1,2,3);

其实,逗号运算符表达式中每一个被逗号隔开的部分都是一个子表达式,即:

int a = (1+2, 3+4, 5+6);

是完全符合语法要求的,而逗号表达式的值是最后一个子表达式的值(逗号运算符结合方向为左到右,所以是最右侧的),即11。

语句

语句是C语言中的基本组成元素,一个C语言程序的源码必然是由语句组成的。

语句的形式有很多种,大致分为:

  1. 表达式语句
  2. 变量定义/声明语句
  3. 函数定义/声明语句
  4. 结构体定义/声明语句
  5. 共同体定义/声明语句
  6. 枚举定义/声明语句
  7. 类型定义/声明语句
  8. 循环控制语句

初学者对上面未听说过的内容不必纠结,我们后面会逐个专门介绍,这里只是进行一个汇总。

上面这8类中,除函数和循环控制类语句以外,其余均以分号做结尾的。

其中声明是告知编译器,这个变量、函数、结构体等在本文件内或者其他文件内有定义。

下面给出每种语句的一个样例,我们主要看表达式语句、变量相关语句,其余的粗略了解即可。

  • 表达式语句
a = 1; //a=1是由赋值运算符组成的赋值表达式,在表达式后加一个分号,就变成了赋值语句。

a = 1 + 2; //1+2是加法运算符组成的加法表达式,其优先级高于赋值运算符,所以先计算加法
//加法表达式的值为3,然后是由等号组成的赋值表达式,表达式的值为3(即等号右侧表达式的值)。
//最后,在赋值表达式后增加一个分号,变成一条语句。

a = b = 1; //由于赋值表达式也有表达式值,因此可以使用这种写法同时给变量a和变量b赋值,他们的值都是1。
  • 变量定义/声明语句
int a; //最基本的变量定义语句,并未给a赋初始值。
//定义语句包含了变量的类型、变量名和分号。

int a = 1;//增加了赋值表达式,给变量定义语句中的变量赋初始值。

static int a = 1; //static在此表示静态变量,后面章节我们会介绍到

int a; //声明变量a与定义写法一致

static int a; //声明本地变量a

extern int a; //声明外部变量a
  • 函数定义/声明语句
int foo (int arg1, char arg2)
{
  //...
  return 0;
}
//定义返回值为整型的函数foo,且函数有两个参数——整型arg1和字符型arg2

int foo (int arg1, char arg2);//与定义类似,但是省略{}及其内容,并用分号结尾

int foo (int, char); //函数声明可省略参数名

static int foo (int, char); //声明本地函数

extern int foo (int, char); //声明外部函数
  • 结构体定义/声明语句
struct person {
  char name[256];
  int age;
};
//定义名为person的结构体,其中包含字符型数组name和整型变量age

static struct person; //声明本地结构体person

extern struct person; //声明外部结构体person
  • 共同体定义/声明语句
union volunteer {
  struct person john;
  struct person susan;
};
//定义名为volunteer的共同体,其中包含两个struct person对象john和susan。共同体中只能操作其中一个成员
  • 枚举定义/声明语句
enum identity {
    teach,
    student
};
//定义名为identity的枚举类型,其中含有teach和student成员。

static enum identity;
  • 类型定义/声明语句
typedef struct person person_t; //定义类型person_t,其类型等价于结构体struct person

static person_t; //声明本地类型person_t

extern person_t; //声明外部类型person_t
  • 循环与控制语句
for (i = 0; i < 10; ++i) {
  //...
}//for循环语句

while (i < 10) {
  //...
}//while 循环语句

do {
  //...
} while (i < 3);//do-while循环语句

switch (c) {
  case 'a':
    //...
    break;
  case 'b':
    //...
    break;
  default:
    //...
    break;
}//switch语句

if (i < 10) {
  //...
} else {
  //...
}//if-else语句
  • 语句表达式
    关于语句表达式这一特殊结构,感兴趣的读者请参考码哥的另一篇文章,《你应该知道的GNU C语句表达式》。

忽略本小节内容并不影响后续C语言的学习和使用。



喜欢的读者可以关注码哥,也可以在下方留言评论,如果有不清楚的地方也可以私信码哥,我会第一时间回复。
感谢阅读!

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

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

相关文章

【算法刷题】Day22

文章目录 1. 按摩师题干&#xff1a;算法原理&#xff1a;&#xff08;dp&#xff09;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. 寻找数组的中心下标题干&#xff1a;算法原理&#xff1a;&#xff08;前缀和&#xff09;代码…

【hcie-cloud】【11】华为云Stack资源与服务扩建【云服务扩容、自动化变更平台公共服务组件、华为云Stack典型高阶服务扩容简介、缩略词】【下】

文章目录 扩容工程简介、扩容管理规模、计算资源扩容与减容云服务扩容云服务扩容简介华为云Stack云服务扩容背景华为云Stack可选基础云服务华为云Stack可选网络服务华为云Stack可选高阶服务华为云Stack云服务扩容流程 自动化变更平台&公共服务组件背景介绍自动化变更平台&a…

ESPCN训练报错解决

ESPCN训练报错解决 超分重建ESPCN训练自己的数据集时会出现报错,主要为制作数据集时的错误,本文将给出报错的解决方法和错误说明。 目录 ESPCN训练报错解决错误一一、错误说明二、解决方法三、错误说明错误二一、错误说明二、解决方法错误一 一、错误说明 在使用自己的数据…

flowable流程部署后act_re_procdef表无对应模型得数据

情况1&#xff1a; 修改前&#xff1a; public static final String XML ".xml"; repositoryService.createDeployment().key(model.getKey()).name(model.getName()).addBytes(model.getName() XML, bpmnXML).deploy();修改后&#xff1a; public static final …

Java_集合进阶Map集合

一、Map集合 1.1 Map概述体系 各位同学&#xff0c;前面我们已经把单列集合学习完了&#xff0c;接下来我们要学习的是双列集合。首先我们还是先认识一下什么是双列集合。 所谓双列集合&#xff0c;就是说集合中的元素是一对一对的。Map集合中的每一个元素是以keyvalue的形式…

Tomcat转SpringBoot、tomcat升级到springboot、springmvc改造springboot

Tomcat转SpringBoot、tomcat升级到springboot、springmvc改造springboot 起因&#xff1a;我接手tomcat-springmvc-hibernate项目&#xff0c;使用tomcat时问题不大。自从信创开始&#xff0c;部分市场使用国产中间件&#xff0c;例如第一次听说的宝兰德、东方通&#xff0c;还…

众和策略:美股全线上涨 中概股大涨

当地时间12月21日&#xff0c;欧洲股市全线下跌&#xff0c;英国富时100指数、法国CAC40指数、德国DAX指数均小幅下跌。美国通胀降温&#xff0c;美股商场三大指数尾盘飙升&#xff0c;纳斯达克指数、标普500指数均涨逾1%&#xff0c;大型科技股多数上涨&#xff0c;特斯拉涨近…

Jenkins自动化构建打包,部署

1.环境准备 上传jdk&#xff0c;maven和tomcat的包&#xff0c;解压到/usr/local下并配置环境变量。 配置jdk [rootserver04 ~]# vim /etc/profile.d/java.sh JAVA_HOME/usr/local/java export PATH$JAVA_HOME/bin:$PATH##加载环境变量 [rootserver04 ~]# source /etc/profi…

Mybatis之增删改查

一、引言 书接上回&#xff0c;我们在了解完mybatis之后&#xff0c;肯定要知道怎么使用&#xff0c;本文就来详细讲解Mybatis的增删改查事务&#xff0c;还不了解怎么配置mybatis的童鞋可以去这篇文章了解一下通俗易懂讲解javaweb之mybatis-CSDN博客 二、Mybatis——增 举例…

Android笔记(二十):JetPack DataStore 之 Proto DataStore

Jetpack DataStore 是一种数据存储解决方案&#xff0c;主要适用于小型数据的处理。它可以通过协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。DataStore有两种实现方式&#xff08;1&#xff09;Preferences DataStor…

基于ssm房屋租赁平台的设计与开发论文

摘 要 目前对于在外的人员来说租赁房屋是最基本的问题。对于房屋的租赁可以选择直接找房东、找专业的房屋租赁公司和自己在网上找房屋。自己找房东的问题在于需要时间&#xff0c;而且对于需要提前租赁房屋的需要多次跑到小区&#xff0c;找中介租赁房屋的问题在于费用问题&am…

消除蛋蛋派

欢迎来到程序小院 消除蛋蛋派 玩法&#xff1a;消除游戏&#xff0c;三个相同形状的蛋蛋连成一条直线即可消除&#xff0c;点击鼠标左键移动球球进行消除&#xff0c; 可以使用道具&#xff0c;共有50关卡&#xff0c;快去闯关吧^^。开始游戏https://www.ormcc.com/play/gameS…

Python爬取电影天堂

前言&#xff1a; 本文非常浅显易懂&#xff0c;可以说是零基础也可快速掌握。如有疑问&#xff0c;欢迎留言&#xff0c;笔者会第一时间回复。 一、爬虫的重要性&#xff1a; 如果把互联网比喻成一个蜘蛛网&#xff0c;那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛通过网页的…

FFmpeg windows安装与使用

FFmpeg下载&#xff1a; 1、进入ffmpeg官网&#xff0c;点击“Download”。官网地址&#xff1a;FFmpeg 2、选择对应环境的编译工具&#xff0c;如下载windows环境下的ffmpeg编译工具 3、点击下载编译好的ffmpeg工具 FFmpeg使用&#xff1a; 1、将ffmpeg编译的bin文件复制出来…

如何用Excel制作一张能在网上浏览的动态数据报表

前言 如今各类BI产品大行其道&#xff0c;“数据可视化”成为一个热门词汇。相比价格高昂的各种BI软件&#xff0c;用Excel来制作动态报表就更加经济便捷。今天小编就将为大家介绍一下如何使用葡萄城公司的纯前端表格控件——SpreadJS来实现一个Excel动态报表&#xff1a; 实…

uniapp 添加分包页面,配置分包预下载

为什么要分包 ? 分包即将小程序代码分成多个部分打包&#xff0c;可以减少小程序的加载时间&#xff0c;提升用户体验 添加分包页面 比较便捷的方法是使用vscode插件 uni-create-view 新建分包文件夹 以在我的页面&#xff0c;添加分包的设置页面为例&#xff0c;新建文件夹 s…

五、Microsoft群集服务(MSCS)环境的搭建

一、【目的】 学会利用Windows Server布置群集环境。 二、【设备】 FreeNAS11.2&#xff0c;Windows Server 2019 三、【要求】 学会利用Windows Server布置群集环境&#xff0c;掌握处理问题的能力。 配置表&#xff1a; 节点公网IP(public)内网IP(private)群集IP(clust…

RocketMQ系统性学习-RocketMQ高级特性之文件恢复与 CheckPoint 机制

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…

理解AI思维链:AI领域的核心概念及其意义

理解AI思维链&#xff1a;AI领域的核心概念及其意义 引言AI思维链的定义AI思维链的重要性实际应用案例分析面临的挑战与未来展望结语 引言 在这个日益由数据驱动的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为科技领域的一颗耀眼的明星&#xff0c;其影响力遍…

TG5032CGN TCXO / VC-TCXO(超高稳定10pin端子型)

TG5032CGN 晶振是EPSON推出的一款额定频率10MHz至40MHz的石英晶体振荡器&#xff0c;该型号采用互补金属氧化物半导体技术&#xff0c;输出波形稳定可靠。外形尺寸为5.0 3.2 1.45mm具有小尺寸,高稳定性。该款晶体振荡器&#xff0c;可以在G&#xff1a;-40C至 85C的温度内稳定…