黑马程序员-C语言基础知识-运算符与表达式

来源:互联网 发布:网络视频怎么发朋友圈 编辑:程序博客网 时间:2024/06/05 04:09

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

算术运算

一、
加法运算(+):
示例1:

#include <stdio.h>int main(){    int a = 1, b = 2;    int c = a + b;    printf("c = %d\n", c);    return 0;}

示例1的运行结果是: c = 3
符号‘+’还可以表示正号,比如:+1、+102。
二、
减法运算(-):
示例2:

#include <stdio.h>int main(){    int a = 10, b = 3;    int c = a - b;    printf("c = %d\n", c);    return 0;}

示例2的运行结果是:c = 7
符号‘-’还能表示负号,比如:-9,-12。
三、
乘法运算(*):
示例3:

#include <stdio.h>int main(){    int a = 2, b = 3;    int c = a * b;    printf("c = %d\n", c);    return 0;}

示例3的运行结果是:c = 6
四、
除法运算(/):
示例4

#include <stdio.h>int main(){    int a = 10, b = 2;    int c = a / b;    printf("c = %d\n", c);    return 0;}

示例4的运行结果是:c = 5
相同类型的数相除得到的结果类型和这两个数相同。
五、
取余运算(%):
不同于数学,取余运算是计算机特有的的一种运算。取余运算就是两个整数相除取余数。取余运算结果的正负性取决于%左边的数值。
示例5:

#include <stdio.h>int main(){    int a = 10, b = 3;    int c = a % b;    printf("c = %d\n", c);    return 0;}

示例5的运行结果是:c = 1
六、
自动类型转换:
等号右边的运算结果的类型与左边的变量类型不一,那么计算机将会自动将右边的结果转换为与左边变量一致的类型。如果是精度较高的类型转换为精度较小的类型会丢失精度。
示例6:

#include <stdio.h>int main(){    int a = 11.8f + 10.9f;//这里将单精度类型转换为整型,精短丢失,运算结果只取整数部分小数部分舍弃赋给变量a    float b = 7 + 9;//整型转换为单精度类型,精度提升    printf("a = %d, b = %.2f\n", a, b);    return 0;}

示例6的运行结果是:a = 22, b = 16.00
七、
自动类型提升:
如果等号右边参与运算的两个数值的类型不一样,计算机将会把精度较小的那个数值提升为和精度较大的那个数值一样的类型。
示例7:

#include <stdio.h>int main(){    int a = 8.4 + 5;    double b = 7.9 / 2;    printf("a = %d, b = %.2f\n", a, b);    return 0;}

示例7的运行结果是:a = 13, b = 3.95
八、
强制类型转换:
有时候我们需要强制性的将某个数转换为其它类型,这时候就需要用到强制类型转换的方法了。
示例8:

#include <stdio.h>int main(){    double a = (double)3 + 9;//通过在要转换的数值前面添加(类型说明符)来进行类型的强制转换    double b = (double)(8 / 4);    printf("a = %.2f, b = %.2f\n", a, b);    return 0;}

示例8展示了强制类型转换的方法。

赋值运算

简单的赋值运算就是通过‘=’号将右边的结果值赋给左边。我们在实际的编程中还会用到复杂一些的赋值运算,比如,‘+=’号的使用等等。下面举例说明。
示例9:

#include <stdio.h>int main(){    int a = 10;    a += 3;//这一句相当于a = a + 3    int b = 8;    b -= 2;    int c = 6;    c *= 2;    int d = 9;    d /= 3;    int e = 1;    e += 4 + 5;//这一句相当于e = e + (4 + 5printf("a = %d, b = %d, c = %d, d = %d, e = %d\n", a, b, c, d, e);    return 0;}

示例9的运行结果是:a = 13, b = 6, c = 12, d = 3, e = 10

自增自减运算

‘++’是自增运算符,‘–’是自减运算符。a++和++a等价于a = a + 1,a–和–a等价于a = a - 1。把自增自减运算符放在变量的前面和后面是不一样的,下面举例说明区别。
示例10:

#include <stdio.h>int main(){    int a = 10;    int b = a++;//'++'写在a的后面意味着先将a原来的值赋给变量b它再自己加1,这句代码过后b的值是10,a的值是11    int c = ++a;//'++'写在a的前面意味着a先自己加1然后将值赋给变量c,这句代码过后a的值是12,c的值也是12    printf("b = %d, c = %d\n", b, c);    return 0;}

示例10的运行结果是:b = 10, c = 12
自减运算与自增运算的计算赋值方式相同。

关系运算(比较运算)

关系运算符(大于‘>’、小于‘<’、大于等于‘>=’、小于等于‘<=’、等于‘==’、不等于‘!=’)用于对两个表达式的值进行比较,返回一个真值(真值用1表示,C语言规定所有非0数皆为真)或者假值(用0表示)。真值表示关系成立假值表示关系不成立。关系运算常用于条件判断语句,如果条件成立返回真值执行下面对应的代码,如果条件不成立返回假值将不执行下面对应的代码。
示例11:

#include <stdio.h>int main(){    int a = 10, b = 3, c = 4;    int d = a >= b + c;//将关系运算a >= b + c的返回值赋给d    if(a >= b + c) printf("%d\n", d);//判断a >= b + c是否成立,如果成立执行后面的代码    return 0;}

示例11的运行结果是: 1(真值)

逻辑运算

一、
逻辑与(&&):
逻辑与的使用格式:“条件A&&条件B”,如果两个条件都成立则结果为1也就是真,如果其中有一个是假那么结果就是假即0。在判断过程中如果条件A是真还不能判断整个表达式的真假性仍需继续判断条件B,如果条件A是假那么无论B是真是假表达式的结果都是假,就不用再判断条件B了。
示例12:

#include <stdio.h>int main(){    int a = 1, b = 4, c = 2;    if(a < b && b > (c += 1))/*前面的条件成立还不能得出整个条件语句的真假,所以会继续判断第二个条件是否成立,第二个条件也成立,整个条件语句为真,执行后面的语句*/    {        printf("第一次输出,c = %d\t", c);//输出结果是c = 3    }    if(a > b && b > (c += 1))/*前面的条件就已经是假那么整个条件语句肯定就是假了,计算机为了提升运算性能,规定这种情况下,第二个条件语句不用再执行,所以(c += 1)不会运算*/    {        printf("第二次输出,c = %d\t", c);//这条语句不会执行    }    printf("第三次输出,c = %d\n", c);/*变量c在第一个if条件语句中进行了一次加1运算,第二个if条件语句中的加1运算没有执行,因此输出结果是c = 3*/    return 0;}

示例12的运行结果是:第一次输出,c = 3 第三次输出,c = 3
二、
逻辑或(||):
使用格式“条件A||条件B”,A、B两个条件都是假该表达式为假,如果有任意一个条件是真那么表达式为真。与逻辑与一样,如果条件A(为真的情况下)已经决定了整个语句的真假性,那么条件B就不用再判断了。
示例13:

#include <stdio.h>int main(){    int a = 1, b = 4, c = 2;    if(a < b || b > (c += 1))    {        printf("第一次输出,c = %d\t", c);    }    if(a > b || b < (c += 1))    {        printf("第二次输出,c = %d\t", c);    }    printf("第三次输出,c = %d\n", c);    return 0;}

示例13的运行结果是:第一次输出,c = 2 第三次输出,c = 3
三、
逻辑非(!):
使用格式“!条件A”,对条件A取反,假的变真,真的变假。
示例14:

#include <stdio.h>int main(){    int a = 1;    if (!a)    {        printf("第一次输出\t");    }    printf("第二次输出\n");    return 0;}

示例14的运行结果是:第二次输出

三目运算

使用格式:条件?语句1:语句2;如果条件为真则执行语句1,如果条件为假则执行语句2。
示例15:

#include <stdio.h>int main(){    int a = 1, b = 2, c = 3, max;    max = a > b ? a : b;//利用三目运算找出a、b中较大的值赋给max    max = max > c ? max : c;//拿a、b中较大的值与c比较找出最大的值    printf("max = %d\n", max);//输出a、b、c中最大的值    return 0;}

示例15利用三目运算找出a、b、c中最大的值,运行结果是:max = 3

sizeof

sizeof运算符用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。
示例16

#include <stdio.h>int main(){    int a;    int b = sizeof(a);    printf("b = %d\n", b);    return 0;}

示例16的运型结果是:b = 4

位运算

位运算就是直接对整数在内存中的二进制位进行操作。
一、
按位与(&):
对应的两个二进位均为1时结果位才是1,否则为0 。比如,9&5,就是1001&0101=0001,因此9&5=1。
二、
按位或(|):
如果对应的两个二进位有一个是1,结果位就是1,否则为0。比如,9|5,就是1001|0101=1101,因此9|5=13。
三、
按位异或(^):
如果对应的两个二进位不相同,那么结果位就是1,否则为0。比如,9^5,就是1001^0101,因此9^5=12。
四、
取反(~):
对某个整数的所有二进位取反,1变成0,0变成1,比如,~9,就是~1001,结果变成0110,因此~9=6。
五、
左移(<<):
就是把某个数的各二进位往左移动相应的位数,高位丢弃,低位补0,数a左移n位其结果就是a乘以2的n次方。比如,8左移2位的结果是32。左移可能会改变数的正负性。
六、
右移(>>):
就是把某个数的各二进位全部右移,符号位不变。数a右移n位就是这个数除以2的n次方。比如,8右移2位的结果是2。

运算符优先级表

下面附上C语言运算符优先级表:
这里写图片描述
优先级自上而下递减。

0 0