继昨天的字符型常量学习,还有一种特殊形式的字符常量,以“\”开头的字符序列,成为转义字符,即’n’表示字符n而\n表示换行,n的意思发生了改变,此外还有\t 表示调到下一个制表符(注:一个制表符的宽度为8个字符);\b表示退格;\r表示回车其运行之后的效果是光标回到本行开头并对原有的数据进行覆盖;\\代表一个反斜杠字符\;\’代表一个单引号字符;\’’代表一个双引号字符;\ddd表示1到3位八进制数所代表的字符;\xhh代表1到2位十六进制数所代表的字符。以下三种形式都表示字符常量‘A’:
char ch = 'A';
char ch = '\101'; //A
char ch = '\x41'; //A
一、运算符
C语言中的算数运算包括“+”、“-”、“*”、“/”、“%”五种运算符。在进行算数运算时要注意运算符的优先级和结合性具体表现为:不同优先级的运算混合时,高优先级的先结合;同一优先级的运算混合时,按照结合性进行结合;优先级高不一定先运算但一定先结合。在这五种运算符中需特别注意的是“/”和“%”。
1.除“/”
(1)如果是两个整形数相除,此时相当于是整除的效果
(2)除法运算中除数不能为0
2.求余“%”
(1)除数不能为0
(2)求余运算运算数必须是整数
(3)结果的符号取决于左操作数的符号
此外“%”具有很多应用:
(1)可用于判断奇数、偶数
(2)num%N ,可获得0~N-1之间的数
(3)随机生成100以内的10个数字
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i = 0;
srand(time(NULL));
for (i = 0; i< 10; ++i)
{
printf("%d\n",rand()%100);
}
return 0;
}
在这段程序中运用到两个函数分别为rand()函数和srand()函数。当rand()函数没有参数时,会随机生成位于0~RAND_MAX之间的整数(RAND_MAX为<stdlib.h>头文件中的一个宏),由于rand()函数生成的是伪随机数,故每次运行后的结果都是相同的,所以为了使每次运行之后的结果是不同的,引用了srand()函数来初始化随机种子,使用不同的种子会rand()函数会产生不同的随机数,通常会使用time()函数作为种子。
void srand(unsigned int seed); //函数原型
time_t time(time_t * tloc); //时间秒数
time(NULL) //返回值就是获得到的秒数值
void为这个函数的返回值类型;srand为函数名;unsigned int seed为形式参数。
同时也了解到:当编译时报错,应是语法错误,此时应检查代码的语法问题;当运行时报错,应是逻辑问题,此时应检查思路或逻辑问题。
3.表达式
表达式是由运算符和运算数构成的字符序列。表达式都是有值的,表达式都是有数据类型的。在这里提到了数据类型的转换,分为隐式类型转换和强制类型转换。隐式类型转换由图从左致右为必转,从下致上是当低精度与高精度混合运算时,低精度往高精度转。强制类型转换其格式为(类型)运算数。
二、“++”自增
表示一次增加1。自增有两种形式a++和++a。
int a = 1;
a++ //后置加加——先用(表达式的结果)后加(让i自增)
++a //前置加价——先加(让i自增)后用(表达式的结果)
在使用自增时应知道(1)a++和++a如果单独使用效果上没什么区别(2)先用后加或者先加后用是参与到别的运算中时才发挥作用的(3)运算数必须是一个可修改的量。在这里又涉及到左值和右值,如a=10,能放在等号左边的值成为左值(如变量);10=a,能放在等号右边的值成为右值(如常量)特殊的:
const int a=10; //a其实是个变量,但是这个变量只读不能修改
此外,左值是可定位的,右值是不可定位的,对于可定位的左值可用&a取地址运算获得a对应的内存空间的首地址编号。
注意在运用自增时,函数传递顺序和i++先用后加,什么时候加没有统一规定故下列程序没有确定的结果
printf("%d%d\n",i,i++);
建议:
int m = i;
int n = i++;
printf("%d%d\n",m,m);
这里有提到贪心法:从左到右逐个扫描,将字符尽可能多的结合成C语言的运算符。由该法来解释下面的程序
int i = 0;
printf("i = %d\n",i+++++i);
该程序的运行结果为
表示错误部分缺少左值,那么原因是什么呢?在i+++++i这个表达式中由贪心法其运算时应为((i++)++)+i,其中i++是表达式为右值,故“++”的左边缺少左值。
三、赋值运算
“=”为赋值运算的运算符,它的作用是将一个数据赋给一个变量。
int a;
a = 10; //赋值运算
//赋值表达式
//结果就是a的值
//类型就是a的类型
a += 1 //a=a+1
a -= 1 //a=a-1
a=b=c=10也是赋值运算。
不同类型的赋值运算
(1)高精度→低精度
double/float→整型→精度丢失
(2)低精度→高精度
(3)长类型→短类型
short→int→高位截断
(4)短类型→长类型
若为无符号短类型则高位补0,若为有符号短类型符号位扩展。
四、逗号运算
逗号运算为顺序求值运算符,其语法为:表达式1,表达式2,.....表达式n
逗号运算的过程为从左到右逐个计算,逗号运算表达式的结果为整个式子最后一个表达式的运算结果。
1+2,a++,3+4 //其结果为最后一个式子的结果7