文章目录
单词学习
表达式
语句
C术语(副作用和序列点)
复合语句(语句块)
自动类型转换
强制转换
带参函数
结语
单词学习
表达式:expression
语句:statement
表达式
概念:表达式由运算符和运算对象组成。最简单的表达式是一个单独的运算对象。以此为基础可以建立复杂的表达式。
举个栗子:
4 -1 2+3 A*(b+c%d)/4 a=5*2 a<8 x=++i%4
如上,运算对象可以是常量,变量,或者两者合体。
子表达式:子表达式即较小的表达式。比如A*(b+c%d)/4中的c%d
每个表达式都有一个值
C表达式有一个重要的特性,每个表达式都有一个值。
2+3 //5 a=2+3 //5 4>1 //1 1>4 //0 3+(a=2+3) //8
语句
定义:语句是C程序的基本构建块。一条语句相当于一条完整的计算机指令。C中大部分语句都以分号(;)结尾。别把表达式和语句混淆了,这里自己多多体会。
最简单的语句:空语句
; //空语句
C把末尾加 分号 的表达式都看作是一条语句(表达式语句)。所以,下面的也没 problem
3; 2+3;
你会问,这有用? 实际他们在程序里什么也不做,不算是真正有用的语句,更准确讲,语句可以改变值或者可以调用函数
a=1; //改变值 i++; //改变值 a=max(x); //调用函数
一条语句相当于一条完整指令,但并不是所有指令都是语句
比如:
a=2+(x=2); //x=2是一条完整的指令,一条完整的指令不一定是一条语句。可能是语句的一部分.
声明:创建了类型和名称,并为其分配内存空间,注意:声明不是表达式语句,C中声明也不是语句,和C++有所不同
#include <stdio.h> int main(void) /* 计算前20个整数的和 */ { int count, sum; /* 声明 */ count = 0; /* 表达式语句 */ sum = 0; /* 表达式语句 */ while (count++ < 20) /* 迭代语句 */ sum = sum + count; printf("sum = %d\n", sum); /* 表达式语句 */ return 0; /* 跳转语句 */ }
本例的while循环只有一条语句,这时就可以省略花括号,如果有多条语句需要用花括号括起来。
while 语句是一种迭代语句,有时也被成为结构化语句
C术语(副作用和序列点)
副作用:对数据对象或文件的修改
比如a=5;这样的赋值就是它的副作用。
还有例如函数 printf();它显示的就是它的副作用。
序列点:是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生
语言中,语句中的分号标记了一个序列点
注意:任何一个完整表达式的结束也是一个序列点
所谓完整表达式就是指这个表达式不是另一个更大表达式的子表达式。
i++<9 yes a=(i++)+(1+i++) no
比如,前面学习过i++ ,我们知道它是先使用,后递增。然而下面的语句可能会改变你的认知。
while (sum++ <10) printf("%d \n",sum);
之前,我们可能会觉得先使用,后递增。但是在while循环中,sum++ <10就是一个完整的表达式,该表达式的结束就是一个序列点,因此,C会在程序去执行打印之前发生副作用(递增sum) 🆗
复合语句(语句块)
复合语句:用花括号括起来的一条或多条语句,复合语句也叫做块
循环中 如果没有花括号循环走到下一个分号处结束,有花括号循环就是花括号中的语句块
学会使用缩进,这样你的代码会更帅,更handsome,更beautiful
自动类型转换
我们在编码时,会有不同类型的常量和变量,当我们混合使用他们,比如浮点型和整型相加,这时如果我们不处理,编译器就会根据规则,自动帮我们完成类型转换。
原则:
1、若参与运算量的类型不同,则先转换成同一类型,然后进行运算;
2、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转换成long型后再进行运算;
3、所有浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再进行运算;
4、char型和short型参与运算时,必须先转换成int型;
5、在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长于左边时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
强制转换
强制转换格式为:(数据类型)(表达式)
a=float(3);
无论是自动转换还是强制转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
带参函数
几个重要概念:
形参:声明函数就创建了形式参数,简称形参
实参:函数调用传递的值实际参数,简称实参
int max(int a,int b); //ANSI函数原型声明(形式参数) max(2,5); //int类型的参数(实际参数)
我们可以说形参是变量,实参是函数调用提供的值,实参被赋值赋给相应的形参
变量名是函数私有的,即在函数中定义的函数名不会和别处的相同名发生冲突
结语
重点通过代码理解表达式,语句。不混淆的程度,以后随之就会过呢更熟练。还有一些术语,尽量理解副作用和序列点,它对我们脑读程序和编码帮助很大。接着了解基本的自动转换规则,学会使用以及强制转换(必会),最后又通俗易懂的说了说形参实参,这对我们理解自定义函数有莫大好处。加油吧。