本文参考C Primer Plus进行C语言学习
文章目录
- 表达式
- 语句
- 副作用和序列点
- 复合语句(块)
- 类型转换
1.表达式
表达式由运算符和运算对象组成。下面是一些表达式:
4
-6
4+21
a*(b+c/d)/20
q=5*2
x=++q%3
q>3
每个表达式都有一个值
2.语句
在C语言中,语句都以分号结尾。因此,
legs=4
只是一个表达式,而下面代码为语句:
legs=4;
#include<stdio.h>
int main()
{int count,sum;count=0;sum=0;while(count++<20)sum=sum+count;printf("sum=%d\n",sum);return 0;
}
该例中的while循环只有一条语句,不需要用花括号括起来。多条语句需要用花括号括起来。
副作用和序列点
副作用是对数据对象或文件的修改。例如,语句:
states=50;
它的副作用是将变量的值设置为50.
序列点是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生。在C语言中,语句的分号标记了一个序列点。意思是,在一个语句中,赋值运算符、递增运算符、递减运算符对运算对象做的改变必须在程序执行下一条语句之前完成。
序列点有助于分析后缀递增何时发生。例如:
while(guests++<10)
printf("%d \n",guests);
在此,C语言初学者认为,“先使用它,再递增它”的意思是,在printf()语句中先使用guests,再递增他。但是,guests++<10是一个完整的表达式,因为它是while循环的测试条件,所以该表达式的结束就是一个序列点。因此,C保证了在程序转至执行printf()之前发生副作用(即,递增guest)。同时,使用后缀形式保证了guests在完成与10的比较后才递增。
可作参考:
3.复合语句(块)
复合语句是用花括号括起来的一条或多条语句。
/*程序段1*/
index=0;
while(index++<10)
sam=10*index+2;
printf("sam=%d\n",sam);
/*程序段2*/
index=0;
while(index++<10)
{
sam=10*index+2;
printf("sam=%d\n",sam);
}
1中。循环结束后,printf()函数只会被调用一次。
2中,每执行一次循环,printf()函数就被调用一次。
4.类型转换
转换规则:
1.由于都是从较小类型转换为较大类型,所以这些转换被称为升级。
2.涉及两种类型的运算,两个值会被分别转换为两种类型的更高级别。
3.类型的级别从高到低依次是long double、double、float、unsignedlong long、long long、unsignes long、long、unsigned int、int。之所以没有char和short因为它们被升级为int或unsigned int。
#include<stdio.h>
int main()
{char ch;int i;float fl;fl=i=ch='C'; //9printf("ch=%c,i=%d,fl=%2.2f\n",ch,i,fl); //10ch=ch+1; //11i=fl+2*ch; //12fl=2.0*ch+i; //13printf("ch=%c,i=%d,fl=%2.2f\n",ch,i,fl); //14ch=1107; //15printf("Now ch=%c\n",ch); //16ch=80.89; //17printf("Now ch=%c\n",ch); //18return 0;
}
-
9和10行:字符'C'被作为1字节的ASCⅡ值储存在ch中。 整数变量i接受由'C'转换的整数,即按4字节存储67。fl由67转换67.00。
-
11和14行:字符'C'被转换为67。然后加1。计算结果为4字节的68。68被解释成'D'的ASCⅡ码。
-
第12行和第14行:ch 的值被转换成4字节的整数(68),然后2乘以ch。为了和fl相加,乘积整数(136)被转换成浮点数。计算结果(203.00f)被转换成int类型,并储存在i中。
-
第13行和第 14行:ch 的值('D',或68)被转换成浮点数,然后2乘以ch。为了做加法,i的值(203)被转换为浮点类型。计算结果(339.00)被储存在fl中。
-
第15行和第16行:演示了类型降级的示例。把ch 设置为一个超出其类型范围的值,忽略额外的位后,最终ch的值是字符s的ASCII码。或者,更确切地说,ch的值是1107265,即83。
-
第17行和第18行:演示了另一个类型降级的示例。把ch 设置为一个浮点数,发生截断后,ch的值是字符P的ASCII码。