C语言学习记录——십칠 操作符和表达式(2)

目录

一、操作符和表达式

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

二、下标引用、函数调用、结构成员

下标引用操作符

函数调用操作符

结构成员

三、表达式求值

隐形类型转换​​​​​​

算术转换

操作符的属性

结合性

是否控制求值顺序


一、操作符和表达式

单目操作符

sizeof——计算字节大小。可以括号里放变量,也可以放类型。计算变量可以省括号,类型不可以省。假如sizeof括号里放入一个赋值的式子,式子并不实际计算,计算的值仍然是按照被赋值变量的类型来计算,比如int b = 0;short a = 11;b = a - 6.结果仍然为4。并且b的值仍为0,没有变成a-6的值 。

~     对一个数的二进制按位取反

假如a是0,按位取反,得到全部都是1的二进制数,但是这是补码,要打印的话则是打印原码,转换过来就是-1。~之后也可以放括号。

前后置++ --

int a = 3

printf("%d \n", ++a)这样打引出4。如果++a,就是先打印出3,然后a再加1,再次打印的话,结果就是4

*     间接访问操作符

解引用操作。

(类型)强制类型转换

int a = (int) 3.14

关系操作符

>

>=

<

<=

!=

==

逻辑操作符

&&          逻辑与

||             逻辑或

&&     两者都为真,则为真,打印1。

||        有一为真,则为真,打印1。

条件操作符

语句1?   语句2:语句3

语句1是否为真,为真就是真。结果是表达式2的值;为假,则表达式3的值是结果。

    int a = 34;
    int b = 5;
    if (a > b)
        printf("%d\n", 3);
    else
        printf("%d\n", -3);
    b = (a >b ? 3 : -3)//或者这样写
    return 0;

再者可用于比较大小

    int a = 10;
    int b = 20;
    int max = 0;
    if (a > b)
        max = a;
    else
        max = b;
    //max = (a > b ? a : b);
    return 0;

逗号表达式

同逗号隔开的多个表达式。从左到右依次执行,整个表达式结果是最后一个表达式的结果

int a = 1;

int b = 2;

int c = (a > b, a = b + 10, a, b = a + 1);

最后c等于13。

如果最后是一个判断语句,为真则整个表达式为真,为假则整个表达式为假。

二、下标引用、函数调用、结构成员

下标引用操作符

声明数组a[10] = { 0 },[]就是下标引用操作符,此时a[2] = 1,那么操作数就是数组名a和索引值2。

函数调用操作符

定义了get_max函数,声明a和b的值,然后int max = get_max(a , b),()就是操作符。操作数是get_max,a, b。

结构成员

struct Stu
{
    char name[20];
    int age;
    char id[20];
};

int main()
{
    int a = 10;
    struct Stu s1 = { "张三", 20, 20123123 };
    struct Stu* ps = &s1;
    printf("%s\n", ps->name);
    printf("%d\n", ps->age);
    return 0;
}

一个简单的小程序。

三、表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值过程中可能需要转换为其他类型。

隐形类型转换​​​​​​

​​​​​​c的整型算术运算总是至少以缺少整型类型的精度来进行的。

为了获得这个精度,表达式中的字符的短整型操作数在使用之前被转换为普通整型,这种转换为整型提升。

 整型提升是按照变量的数据类型的符号位来提升的。

char a = 3;

char b = 127;

char c = a +b;

结果是-126。尽量写详细一点

char a = 3;

char b = 127;

char c = a +b;

3对应的二进制数,由于是char类型,那就只能8位,所以截断前面的,剩下00000011。同理,127就会剩下01111111。但是当相加时,CPU内整型计算器(ALU)的操作数的字节长度一般为int的字节长度,所以需要补到32位二进制数字。相加之后等于10000010,补成32个,1为符号位,所以11111111111111111111111110000010,这是补码,要得到原码,符号位不变,10000000000000000000000001111110,结果就是-126。

算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

long double

double

float

unsigned long int

long int

unsigned int 

int

下面的主动转换为上面的,比如int和double一起运算,int转换为都double

操作符的属性

优先级,结合性,控制求值顺序。两个相邻操作符,优先级如果相同,取决于结合性。不同则看优先级。

优先级不写了

结合性

从右到左计算,从左到右,无结合性

是否控制求值顺序

典型的就是逻辑与,逻辑或,条件操作符?:,以及逗号表达式。逻辑与,前面为假,那么就不需要算之后的了,这样就是控制求值顺序了

当知道所有后,所有的表达式都可以找到顺序,找不到就是本身表达式错了。

比如a*b + c*e + f*g        c + --c,一些无法按照操作符的属性计算,没有唯一的计算路径,不同编译器也不同结果。

结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值