【C语言语法】表达式与语句的区别与联系
在看题解的时候发现了这样一句话:
if(sum>=n)sum-=(l*l),l++;
这里的两个赋值表达式竟然可以用逗号分隔。这样就只需要一个分号,可以不加大括号了,太舒服了,因为我个人写代码的习惯就是尽量简洁,能不加大括号那肯定不加。所以逗号和分号到底有什么区别呢,什么时候可以用逗号代替分号呢?
百度了一下C语言中逗号和分号的区别,看到这样一个解释:逗号是表达式结束标志,分号是语句结束标志。(前者并不确切,逗号其实属于一种运算符,后文会解释)
咦?什么是表达式,和语句有啥区别?阿巴阿巴。突然觉得自己对C语言的了解太肤浅了。
下面是正文:
一.表达式:
定义:由操作符和操作数构成的式子。
操作数就是常量或变量。
操作符则是+,=,/,*,/=,(),[],&,&&等等等等,也可以叫做运算符。
注:任何表达式都是有返回值的。可以理解为表达式本身也有值。
不知道你们有没有遇到过这样的错误:
比如:手残把while(x==10) 写成了 while (x=10),然后程序就在这里死循环了,永远出不来。
编译器不会向我们报错,因为这样的写法其实是合法的,赋值表达式是有(返回)值的。经查询,赋值表达式的返回值是赋值符号右边的值。x=10的值就是10,所以while永远不会结束。我写了一段很简单的程序实验了一下。
int n=0;
int t;
if(t=n)cout<<"hello world"<<endl;
结果是没有任何输出。说明t=n的值是0,cout语句没有执行。
除了赋值表达式,其他的表达式也都是有返回值的。汇总如下:
赋值表达式:赋值符号(等号)右边的值。
算术表达式:由算术运算符连接而成的式子,比如3+7,4+x/2,它的返回值就是运算的结果,这个应该很好理解。
关系表达式:由关系运算符连接而成的式子,比如3<7,x≥5,它的返回值取决于式子的真假,比如3<7是真的,返回1,3>7是假的,返回0.
逻辑表达式:逻辑运算符(&&,||,!)连接而成的式子,这个返回值就是逻辑运算结果,比如1&&0返回0,2||0返回1,!0返回1。顺便说下,在C语言中0代表假,非0就是真(而不仅仅是1为真)
位逻辑表达式:位逻辑运算符(&,|,^,~)连接而成的式子,返回值就是位逻辑运算结果,只要对位逻辑运算符有了解即可。因为主要是想讲返回值,就不展开了。
逗号表达式:逗号的作用是分隔表达式,例:表达式1,表达式2,表达式3。而他们整体又称作逗号表达式,逗号表达式从左往右执行每一个表达式,且返回最后一个表达式的值。即逗号表达式这个整体的值就是它最后一个表达式的值
当然还可以将上述表达式组合起来成为更复杂的表达式。
插两道题讲:
1.求表达式(k=3*2,k+4),k+2 的值
根据逗号表达式从左往右运算的规则:
1)k=3*2 这是一个赋值表达式,表达式的值为等号右边的值:6, 且k被赋值为6
2)(6,k+4) k+4为10(此时k为6,因为先执行了逗号前的赋值表达式) ,逗号表达式的值为最后一个表达式的值即10.但注意k此时仍然为6,因为没被赋值。
3) 10,k+2 k+2为8,总体值为后者,也就是8。
综上,答案为8。
2.求下面程序的输出结果
int x,y,z;
x=1;
y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z);
答案是2,3,1。这里面要注意的就是z,因为逗号符的运算优先级是最低的,所以z=x++被看作了逗号表达式的第一个表达式。
二.语句
语句是什么?
C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。
C语言中共有五种语句,分别为:
1.表达式语句
表达式语句由表达式加上分号组成。其一般形式为: 表达式;
写到这里,其实我已经彻底明白了博客一开头的疑问,那句话就是将两个赋值表达式组合成了一个逗号表达式而已!但是要注意的是,逗号只能分隔表达式,因此如果我们如下这么写,编译器是会报错的,因为break是语句而不是表达式!
if(sum>=n)sum-=(l*l),l++,break;
执行表达式语句就是计算表达式的值
2.函数调用语句
由函数名、实参加上分号组成。其一般形式为:函数名(实参表);
我们调用的函数可以是自己写的,也可以是头文件中包含的。
例如 printf("Hello"); 就是一个函数调用语句,printf是<stdio.h>中的一个头文件
3.控制语句
控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句。 可分成以下三类:
条件判断语句:if、switch语句;
循环执行语句:do while语句、while语句、for语句;
转向语句:break语句、goto语句、continue语句、return语句。
4.复合语句
把多个语句用括号{}括起来组成的一个语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。
例如:
int main()
{int x;{for(int i=1;i<=3;i++)3+4;x=6;x++;printf("%d\n",x);;;;;{x++;printf("%d",x);;;;;}}return 0;
}
这段代码没有任何意义,但在语法上是正确的,编译器不会报错。这个复合语句里包括了控制语句,表达式语句,空语句,函数调用语句,甚至还有一个复合语句。
5.空语句。
只有分号,啥也没有的语句。
三.总结
表达式与语句的区别
1.二者功能不同:
表达式本身是什么都不做的,只返回值,只是单纯的计算过程。它可以被放在任何需要值的地方。当然赋值表达式是比较特殊的,它虽然也返回值,但主要作用显然是改变变量的值,其实赋值表达式更像一个语句。
语句则是一个行为,负责执行某种操作,没有返回值。程序就是通过语句来执行功能的。语句由分号(或花括号)来结尾。
2.二者本质不同:
表达式由操作符(运算符)和操作数构成的式子。
语句的组成相对复杂,多种多样。
表达式与语句的联系
1.表达式语句就是仅有表达式组成的语句(其实就是指赋值语句,或者由赋值语句组成的逗号表达式,不然根本没有意义)
2.很多语句需要用到值,也就是表达式。比如while()的括号中需要一个值来告诉它循环是否结束且我们一般都会用关系表达式
其实深究表达式与语句的区别并没有什么意义。我们只需要记住,表达式是值,而语句是操作即可。
【C语言语法】表达式与语句的区别与联系相关推荐
- C++ Primer Plus(嵌入式公开课)---第5,6章 循环和关系表达式 分支语句和逻辑运算符
20220222 C++ Primer Plus - 第五.六章 附录: 1.ASCII码字符对照表 2.C++ 运算符优先级 第1-3章 第4章 复合类型 第5章 循环和关系表达式 5.1 for循 ...
- C语言中文网js,JS语句完全攻略
JavaScript 语言定义了 20 套(或个)语句命令,分别执行不同的操作. 以用途划分,JavaScript 语句可以分为:声明.分支控制.循环控制.流程控制异常处理和其他. 以结构划分,Jav ...
- C语言之运算符,表达式和语句总结
目录 前言 一.各种运算符 Ⅰ.算术运算符 Ⅱ.赋值运算符 Ⅲ.关系运算符 Ⅳ.逻辑运算符 Ⅴ.条件运算符(?:) Ⅵ.逗号运算符(,) Ⅶ.位运算符 Ⅷ.其他运算符 二.优先级大总结 三.类型转换 ...
- 手写C语言之分支循环语句-语法详细版(06)
目录 前言 什么是语句? 分支选择语句 if 语句 悬空else switch语句 switch和break switch-default 循环语句 while循环 break与continue 九九 ...
- c语言中赋值表达示与复制语句的区别
最大区别: 赋值语句后面必须要有分号,(其实是语句都必须有分号),如i=i+1 是赋值表达示,而i=i+1:是赋值语句. 赋值运算符: "=",它的作用是将一个数据(可以是一个表达 ...
- matlab函数表达式里分号_C语言表达式和语句
一.表达式 在C语言中,常量.变量.函数调用以及按C语言语法规则用运算符把运算数连接起来的式子都是合法的表达式 . 最后一类可以理解为运算符和运算对象的组合.例如: 算术表达式 = 算术运算符 + 运 ...
- C语言基础之5:运算符、表达式和语句
Tips1: 关键字:while.typedef 运算符:=.-.*./.%.++.--.(类型名) C语言的各种运算符,包括用于普通数学运算的运算符 运算符优先级以及语句.表达式的含义 while循 ...
- go语言基础语法-for循环语句
前言 循环语句,是基础语法中最重要的一部分,可以实现代码的反复执行. 一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件. 与其它主流编程语言不同的的是,Go语言中的循环语句只支持 f ...
- 0x5的c语言表达式是,0X05 运算符、表达式跟语句
0X05 运算符.表达式和语句 如果有很强劲的逻辑能力,或者是构思已久的话,你可以写一个很复杂的表达式,但为了使代码方便阅读,最好一个表达式不要超过3个运算符.(这里的语句,并不包含代码块),使用自增 ...
最新文章
- CNN在文本分类的应用(内有代码实现) 论文Convolutional Neural Networks for Sentence Classification
- Tomcat项目部署
- 一直在构建工作空间_国际资讯Python与地理空间分析
- iBATIS.NET 学习笔记(八)
- java5错误_Error:java: 错误: 不支持发行版本 5
- flask nginx+uwsgi超时设置
- Gridview 增加多个空行。
- 解决OSError: [Errno 22] Invalid argument:C:\\Windows\\Fonts\\simhei.ttf\u202a
- 读书笔记《Unix编程艺术》一
- 动态比较器蒙特卡洛(mente carlo)仿真失调电压
- 笔记本电脑硬盘不见了_笔记本检测不到硬盘怎么办_电脑突然检测不到硬盘的解决方法-系统城...
- 【机器学习】1. 线性模型 - 普通最小二乘法
- ubuntu Anaconda安装gi模块 ValueError: Namespace Gtk not available
- 东南亚跨境电商平台Lazada、Shopee、速卖通转化率低怎么办?(测评自养号)
- 西安三本计算机专业可报院校,西安三本大学前十名, 西北大学现代学院仅第四...
- 自费送几本豆瓣9.0高分Python书籍,助你涨薪至30K
- centos7安装大数据平台
- 深入理解QStateMachine与QEventLoop事件循环的联系与区别
- Graphics的平移与旋转
- 血糖仪等蓝牙设备SDK
热门文章
- Intel寄存器名称解释及用途,%eax%ebx等都是什么意思
- 原生js实现canvas粒子特效
- 基于STM32+0.96寸OLED - - 7脚SPI接线显示+代码解析
- 介于上海与江苏的地铁小户型
- PDF阅读软件哪个好用?思路提供
- 陈坤VS黄晓明:用大数据解读大明星
- 互联网日报 | 7月21日 星期四 | 脉脉CEO再回应点评招聘评论真实性;​微信版本再更新;上半年前十位SUV品牌销量排名出炉...
- codeforces 869E The Untended Antiquity
- Jquery .val 与 .value 区别
- 【深度学习】深度学习:技术原理、迭代路径与局限