一、此次学习小结
1.条件操作符(三目操作符)
exp1 ? exp2 : exp3;
判断表达式一是否成立,是就执行2,不成立就执行3
一般将较大值和较小值按照自己的要求放在两个数中
一个if else 语句也可以用三木操作符操作
2.逗号表达式
逗号表达式要注意的点是,如果括号里长串式子,则返回最后一个
如:
int c = (1+2,4+5,6+9),1+2会执行,4+5会执行但是只会返回最后一个值
则c等于15,返回最后一个表达式的值
3.下标引用,函数调用和结构成员
3.1下标引用操作符就是数组的方括号 [ ]
int arr[3] = {1,2,3};
arr[1] = 10;
也可以这样写
2[arr] = 15;
[]表示操作符,操作下标和数组名
3.2函数调用是小括号 ()
小括号就是函数调用操作符
GR();
sizeof()就不是函数,因为他是操作符,因此可以去掉括号操作
sizeof 5;是正确的但是不能求int的大小是不可以去掉括号的
4.结构成员
想要访问结构成员,我们可以用两种操作符
结构体 . 成员名
结构体指针 -> 成员名
结构体 . 成员名
结构体指针 -> 成员名
struct book {
int id = 123;
int price = 55;
};
int main()
{
struct book book1;
printf("%d",book1.id);
struct book* pbook1 = &book1;
printf("%d",pbook1->id);
}
5.隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型 提升。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长 度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转 换为int或unsigned int,然后才能送入CPU去执行运算。
char a,b,c...
c= a+b;
先要转化为整型在送到CPU里去运算,结果返回给c,结果将被截断
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
}
实例1中的a,b要进行整形提升,但是c不需要整形提升
a,b整形提升之后,变成了负数,所以表达式 a==0xb6 , b==0xb600 的结果是假,但是c不发生整形提升,则表
达式 c==0xb6000000 的结果是真.
所程序输出的结果是:
c
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
实例2中的,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字
节.
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof(c) ,就是1个字节
5.1.2 算术转换
就是
float a = 1.2;
int sum = a;
会有精度丢失
6.操作符的属性
复杂表达式的求值有三个影响的因素。
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。 操作符优先级
int fun()
{
static int count = 1;
return ++count;
}
int main()
{
int answer;
answer = fun() - fun() * fun();
printf( "%d\n", answer);//输出多少?
return 0;
}
有问题的代码,函数调用不知道是先调用那个
虽然在大多数的编译器上求得结果都是相同的。
但是上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先算乘法,
再算减法。
函数的调用先后顺序无法通过操作符的优先级确定。
二、此次学习收货
感受:此次重点学习了操作符的用法,弥补了之前对操作符的认识,现在对操作符的认识更进一步了,加油,你只管付出