03-C语言-运算符与表达式

一、运算符分类

运算符类型 说明
算术运算符 用于四则运算
赋值运算符 将表达式的值赋给变量
比较运算符 用于表达式的比较,返回真或假
逻辑运算符 用于根据表达式的值返回真值或假值
位运算符 用于处理数据的位运算
sizeof运算符 计算对象的字节数长度

1.1 算术运算符

运算符 术语/说明 示例 结果
+ 正号 +3 3
- 符号 -3 -3
+ 加号 2+3 5
- 减号 5-3 2
* 乘号 2*3 6
/ 除号 10/2 5
% 取模(取余) 10%3 1
++ 前自增 a=2,b=++a a=3,b=3
++ 后自增 a=2, b=a++ ,a=3,b=2
-- 前自减 a=3,b=--a a=2,b=2
-- 后自减 a=3,b=a-- a=2,b=3

注意

  • m % n ==> m和n只能是整型
  • int / int = int
  • int / float = float ==> 将int类型转换为float类型进行计算
  • float / int = float ==> 将int类型转换为float类型进行
  • float / float = float
  • double / int = double ==> 将int类型转换为double类型进行计算
  • int / double = double ==> 将int类型转换为double类型进行计算
  • float / double = double ==> 将float类型转为double类型进行计算
  • double / float = double ==> 将float类型转为double类型进行计算
  • double / double = double

算术运算符的使用示例

#include <stdio.h>
int main(){
    printf("3 + 2 = %d\n", 3+2);
    printf("3 - 2 = %d\n", 3-2);
    printf("3 * 2 = %d\n", 3*2);
    printf("3 / 2 = %d\n", 3/2);  // 返回的是一个比真实值小的最大整数
    printf("10.0f / 3 = %f\n", 10.0f/3); // 返回真实值
    printf("10.0f / 3.0f = %f", 10.0f/3.0f);
    printf("10.0 / 3.0 = %lf", 10.0/3.0);
    int i = 10;
    int j = i++; // 使用i之后,在对i进行自增1 i = 11, j = 10
    printf("i = %d\tj = %d\n", i, j);
    j = ++i;  // 对i进行自增1之后,使用i i = 12, j = 12
    printf("i = %d\tj = %d\n", i, j);
    j = i--; // 使用i之后,在对i进行自减1 i = 11, j = 12
    printf("i = %d\tj = %d\n", i, j);
    j = --i; // 对i自减1,之后在使用i; i = 10, j =10
    printf("i = %d\tj = %d\n\n", i, j);
    return 0;
}

1.2 赋值运算符

赋值符号与算术运算符的连用

运算符 术语/说明 示例 结果
= 赋值符号 a=3,b=2, a=b a=2,b=2
+= 加等于 a=2,a+=1;a=a+1 a=3
-= 减等于 a=3, a-=2;a=a-2 a=1
*= 乘等于 a=3,a=2;a=a2 a=6
/= 除等于 a=6,a/=3;a=a/3 a=2
%= 模等于 a=10,a%=3;a=a%3 a=1
#include <stdio.h>
int main(){
    int c1;
    c1 = 10; // 将10赋值给c1
    printf("c1 = %d\n", c1);
    c1 += 1;  // c1 = c1 + 1
    printf("c1 += 1 -> c1 = %d\n", c1);
    c1 -= 1;  // c1 = c1 -1
    printf("c1 -= 1 -> c1 = %d\n", c1);
    c1 *= 2;  // c1 = c1 * 2
    printf("c1 *= 2 -> c1 = %d\n", c1);
    c1 /= 2;  // c1 = c1 /2
    printf("c1 /= 2 -> c1 = %d\n", c1);
    c1 %= 3; // c1 = c1 % 3
    printf("c1 %%= 3 -> c1 = %d\n", c1);
    return 0;
}

1.3 比较运算符

比较运算中,返回一个_Bool类型的数据,这是C99标准中添加的类型。即逻辑值true和false。因为C语言用值1表示true,值0表示false,所以_Bool类型实际上也是一种整数 类型。但原则上它仅占用1位存储空间,因为对0和1而言,1位的存储空间足够了

运算符 术语/说明 示例 结果
== 相等于 4 == 3 0
!= 不等于 4 != 3 1
< 小于 4 < 3 0
> 大于 4 > 3 1
<= 小于等于 4 <= 3 0
>= 大于等于 4 >= 1 1

1.4 逻辑运算符

运算符 术语/说明 示例 结果
! \neg !a 如果a为假,则!a为真.如果a为真,则!a为假
&& \land a && b 如果a和b都为真,则结果为真,否则为假
|| \vee a||b 如果a或b有一个为真,则结果为真,二者都为假时,结果为假

比较运算符和逻辑运算符示例

#include <stdio.h>
int main(){
    _Bool x1=0;
    _Bool x2=1;
    printf("!0 = %d\n", !x1);
    printf("!1 = %d\n", !x2);
    printf("1 && 1 = %d\n", x2 && x2);
    printf("1 && 0 = %d\n", x2 && x1);
    printf("0 && 0 = %d\n", x1 && x1);
    printf("1 || 0 = %d\n", x2 || x1);
    printf("1 || 1 = %d\n", x2 || x2);
    printf("0 || 0 = %d\n", x1 || x1);
    return 0;
}

1.5 位运算符

运算符 中文名称 功能描述
& 按位与 (m&n)参与运算的m、n,如果相应位数都为1,则结果为1
| 按位或 (m|n)参与运算的m、n,如果相应为数只要有一个1则为1
^ 按位异或 (m^n)参与运算的m、n,如果对应位数不同时,结果为1
~ 按位取反 (~m)将m的二进制数+1后乘-1,~m=-(m+1)
>> 右移动 (m >> n)将m的二进制位全部右移n为,低位丢弃高位补0
<< 左移动 (m << n)将m的二进制位全部左移n为,高位丢弃低位补0

位运算符使用示例

#include <stdio.h>
int main(){
    printf("10u & 9u = %d\n", 10u & 9u); // 10u & 9u = 8
    printf("10u | 9u = %d\n", 10u | 9u); // 10u | 9u = 11
    printf("10u ^ 9u = %d\n", 10u ^ 9u);  // 10u ^ 9u = 3
    printf("~10u = %d\n", ~10u);  // ~10u = -11
    printf("10u << 2 = % d\n", 10 << 2);  // 10u << 2 =  40
    printf("10u >> 2 = %d\n", 10 >> 2);  // 10u >> 2 = 2
    return 0;
}

1.6 运算符的优先级

运算符的优先级

1.7 类型转换

1.7.1 隐式转换

#include <stdio.h>

int main()
{
    int num = 5;
    printf("s1=%d\n", num / 2);
    printf("s2=%lf\n", num / 2.0);
    return 0;
}

1.7.2 强制类型转化

强制类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,其基本语法格式如下所示:
(类型) (表达式或变量)

#include <stdio.h>

int main()
{
    float x = 0;
    int i = 0;
    x = 3.6f;
    i = x;  //x为实型, i为整型,直接赋值会有警告
    i = (int)x;  //使用强制类型转换
    printf("x=%f, i=%d\n", x, i);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容