赋值表达式的目的是把值存储到内存位置上,用于储存值的数据区域统称为数据对象,使用变量名是标识对象的一种方法。对象指的是实际的数据存储,左值是用于标识和定位存储位置的标签,右值指的是能赋值给可修改左值的量。
void example1() {
int i;
i = 100; //将右边的数值100赋值给左边的变量
}
void example2() {
int i = 5, j = 3;
printf("%d\n", i + j);//8
printf("%d\n", i - j);//2
printf("%d\n", i * j);//15
printf("%d\n", i / j);//1 取模
printf("%d\n", i % j);//2 取余
printf("%d\n", -i + j);//-2 符号运算符
}
sizeof运算符以字节为单位返回运算对象的大小,sizeof返回size_t类型的值,它是一个无符号整数。C语言中有一个typedef机制,它允许为现有类型创建别名,如下:
void example3() {
double typedef haha; //为double创建一个haha的别名
haha h = 20; //使用haha来声明一个变量并赋值
printf("%f\n", h); //20.000000
size_t t = sizeof(int);//size_t就是个无符号整数类型的别名
printf("%u\n", t);//4个字节
}
++出现在作用的变量前面被称为前缀模式,这种模式是变量先自增再参与其他运算(先自增再使用)
++出现在作用的变量后面被称为后缀模式,这种模式是变量先参与其他运算再自增(先使用再自增)
void example4() {
int a = 2, b = 2;
int prefix, suffix;
prefix = 10 * ++a; //prefix=30,a先自增再与10相乘,然后将结果赋值给prefix
suffix = 10 * b++; //suffix=20,b先与10相乘并赋值给suffix,然后b再自增
printf("prefix = %d ***** suffix = %d", prefix, suffix);//prefix = 30 ***** suffix = 20
}
递减运算符的运算规则同递增相同,只需要将++替换成--即可
表达式是由运算符和运算对象组成,运算对象可以是常量、变量或二者的结合。一些表达式由子表达式组成。每个表达式都有一个值,要获得这个值,必须根据运算符优先级规定的顺序来执行操作。
void example5() {
//一些常见的表达式,表达式都有一个值
int i;
i = -4 + 6;
printf("%d\n", i); //2
int j = 6;
i = ++j;
printf("%d\n", i); //7
int a;
i = a = 2 + 5;
printf("%d\n", i); //7
i = 5 > 3;
printf("%d\n", i); //1
i = 6 + (a = 2 + 3);
printf("%d\n", i); //11
}
语句是C程序的基本构建块,一条语句相当于一条完整的计算机指令,大部分语句都以 ; 结尾。
void example6() {
int num; //这只是声明,不是表达式语句。声明创建了名称和类型,并为其分配内存位置
//num = 5 //它只是一个表达式
num = 5; //这是一个语句
//下面是一个简单的循环语句(迭代语句)
int a = 0;
while (++num < 10)
a += num;
printf("%d", a); //0+6+7+8+9=30
}
① 当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int;
② 涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别;
③ 类型的级别从高到低依次是:long double、double、float、unsigned long long、long long、unsigned long 、long、unsigned int、int,当long和int的大小相同时,unsigned int比long的级别高;
④ 在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型,这个过程可能会导致类型升级或降级;
⑤ 当作为函数参数传递时,char和short被转换成int,float被转换成double
① 目标类型是无符号整型,且待赋的值是整数时,额外的位将被忽略;
② 目标类型是一个有符号整型,且待赋的值是整数,结果因实现而异;
③ 目标类型是一个整型,且待赋的值是浮点数,该行为是未定义的;
在某个变量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型,圆括号和它括起来的类型名构成了强制类型转换运算符。
void example7();
int main(void) { //使用void关键字表明此函数不接受任何参数
example7(10);//函数调用传递的值为实际参数,这里函数调用把实际值10传递给函数
return 0;
}
void example7(int n) {//声明参数,创建形式参数的变量,表明此函数接受一个int类型的参数
printf("%d", n + 10);//20
}
小于:< 小于或等于:<= 等于:== 大于或等于:>= 大于:> 不等于:!=
对于C而言,表达式为真的值是1,表达式为假的值是0
void example8() {
int a, b;
a = (10 > 2);
printf("%d\n", a);//1
b = (10 < 2);
printf("%d\n", b);//0
}
_Bool类型的值只能存储1(真)和0(假),如果把其他非零的数值赋给_Bool类型的变量,该变量会被设置为1,这反映了C语言把所有非零的值都视为真。
void example9() {
_Bool b;
b = 3;
printf("%d\n", b); //1
b = -1;
printf("%d\n", b); //1
b = 0;
printf("%d\n", b); //0
int i = 5, j = 0;
while (i -= 1) {//i=i-1,当i为0时终止循环
j += i;//j=j+i
}
printf("%d", j);//4+3+2+1=10
}
+= 例:i +=j,就是i = i + j,如果i = 1,j = 2,则i +=j 运算结果是i = 3
-= *= /= %= 等运算符与+=一致