运算符和表达式
创始人
2025-05-28 14:54:39

一、运算符和表达式

由变量、常量和函数调用按C语言语法规则用运算符连接起来的式子称为表达式

凡是合法的表达式都有一个值,即运算结果。

单个的常量、变量、函数调用也可以看作是表达式的特例。

表达式的求值按运算符的优先级和结合性规定的顺序进行。

1、算术运算符和算术表达式

1.基本算术运算符

基本运算符是:+(加)、-(减)、*(乘)、/(除)、%(求余)。

这些运算符需要有两个运算对象,称为双目运算符

其中运算符“+”、“-”也可用作取正和取负的单目运算符使用。

求余运算符“%”的运算结果是两数相除所得的余数,运算符的左侧为被除数,右侧是除数。求余运算符的运算对象只能是整型量

注意:

  1. 在基本运算符中,单目运算符的结合性为右结合,双目运算符的结合性为左结合。
  2. 整数相除,结果为整数,且只保留整数部分。
  3. 取余数运算的两个操作数必须是整数,结果也是整数。
  4. 圆括号()的优先级最高。

2.自增、自减运算符

  • 自增:++
  • 自减:–

自增运算符的功能是使变量的值自增1。

自减运算符的功能是使变量的值自减1。

自增、自减运算符只需要一个运算对象,称为单目运算符

自增、自减运算符构成的表达式有两种形式,前缀形式:++i和–i,后缀形式:i++和i–。

  • ++i i变量自增1后在参与运算
  • i++ i变量参与运算后,i的值再自增1
  • --i i变量自减1后在参与运算
  • i-- i变量参与运算后,i的值再自减1
#include
int main() {int i;printf("请输入一个值:");scanf_s("%d", &i);printf("%d\n", ++i);printf("%d\n", --i);printf("%d\n", i++);printf("%d\n", i--);printf("%d\n", -i++);printf("%d\n", -i--);return 0;
}

结果:

在这里插入图片描述

对以上结果分析:

  • i的初值为8;
  • 执行printf("%d\n", ++i);,因为是++i,所以i的值先加1然后再参与运算即输出,所以输出的结果为9,这时i的值为9;
  • 执行printf("%d\n", --i);,因为是–i,所以i的值先减1然后再参与运算即输出,所以输出的结果为8,这时i的值为8;
  • 执行printf("%d\n", i++);,因为是i++,所以先参与运算即输出i的值,然后i的值再加1,所以输出的结果为8,这时i的值为9;
  • 执行printf("%d\n", i--);,因为是i–,所以先参与运算即输出i的值,然后i的值再减1,所以输出的结果为9,这时i的值为8;
  • 执行printf("%d\n", -i++);,因为是i++,所以先参与运算即输出-i的值,然后i的值再加1,所以输出的结果为-8,这时i的值为9;
  • 执行printf("%d\n", -i--);,因为是i–,所以先参与运算即输出-i的值,然后i的值再减1,所以输出的结果为-9,这时i的值为8;

3、算术表达式

由算术运算符和括号将运算对象(常量、变量、函数等)连接起来的式子,称为算术表达式

例:

x+y+z

(f1*2.0)/f2+5.0

++i

在C语言表达式中,所有的运算符号都是不能省略的。

2、赋值运算符和赋值表达式

1.简单赋值运算符和赋值表达式

简单赋值运算符为 = 。其一般形式为:

变量 = 表达式

赋值表达式的功能是:将赋值运算符右边表达式的值赋给赋值运算符左边的变量。

例:

c = a + b

a = b = c = 0

x = (a = 4) + (b = 5)

赋值表达式有类型转换的问题。当赋值运算符两边的数据类型不同时,系统会进行自动类型转换,把赋值符右边的类型转换为左边的类型。

赋值表达式的转换规则:

  1. 实型(float、double)赋给整型变量时,只将整数部分赋给整型变量,舍去小数部分。
  2. 整型(int、short int、long int)赋给实型变量时,数值不变,但将整型数据以浮点形式存放到实型类变量中,增加小数部分(小数部分的值为0)。
  3. 字符型(char)赋给整型(int)变量时,由于字符型只占1个字节,整型为2个字节,所以int变量的高八位补的数与char的最高位相同,低八位为字符的ASCII码值。
  4. 整型(int)赋给字符型(char)变量时,只把低八位赋给字符变量。
#include
int main() {int x1 = 66, x2, x3;float f1 = 6.66, f2;char c1 = 'A', c2;x2 = f1;              //实型赋给整型f2 = x1;              //整型赋给实型x3 = c1;              //字符型赋给整型c2 = x1;              //整型赋给字符型printf("%d\n", x2);printf("%f\n", f2);printf("%d\n", x3);printf("%c\n", c2);return 0;
}

结果:
在这里插入图片描述

2、复合赋值运算符及其表达式

复合赋值运算符是在简单赋值运算符 = 前加其他双目运算符构成的。由复合赋值运算符连接的式子称为(复合)赋值表达式,一般形式为:

变量复合赋值运算符表达式

例如:

a+=5等价于a = a + 5

x * = y+7等价于x = x * (y + 7)

r % = p 等价于r = r % p

#include
int main() {int a = 10, b = 12, c = 13;a += 1;b *= 10;c %= 5;printf("%d\n", a);printf("%d\n", b);printf("%d\n", c);return 0;
}

结果:

在这里插入图片描述

3、逗号运算符和逗号表达式

用逗号运算符连接起来的式子,称为逗号表达式。逗号表达式的一般形式为:

表达式1,表达式2,.......,表达式n

逗号表达式的求值过程是:先求表达式1的值,再求表达式2的值,依次下去,最后求表达式n的值,表达式n的值即作为整个逗号表达式的值。

#include
int main() {int a = 2, b = 4, c = 6, x, y;y = ((x = a + b), (b + c));  //逗号运算符printf("y = %d\nx = %d\n", y, x);return 0;
}

结果:

在这里插入图片描述

分析:

可以看出:y等于整个逗号表达式的值,也就是逗号表达式2的值(b + c),x是表达式1的值。

说明:

  1. 程序中使用逗号表达式,通常是要分别求表达式内各表达式的值,并不一定要求整个表达式的值。
  2. 并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中的逗号只是用作各变量之间的间隔符。

二、不同类型数据间的混合运算

1.自动类型转换

自动类型转换是当参与同一表达式中的运算量具有不同类型时,编译系统自动将它们转换成同一类型,然后再按同类型量进行运算的类型转换方式。

自动转换的规则:当两个运算量类型不一致时,先将低级类型的运算量向高级类型的运算量进行类型转换,然后再按同类型的量进行运算。

在这里插入图片描述

说明:

  1. 横向向左箭头表示必定转换。
  2. 纵向向上箭头表示当参与运算的量其数据类型不同时需要转换的方向,装换由“低级“向”高级“进行。

如:float与int运算时,先将float转换成double、int转换成double,然后再进行运算。

2、强制类型转换

强制类型转换的一般格式:

(数据类型说明符)表达式

功能:把表达式的运算结果强制转换成类型说明符所表示的类型。

强制类型转换主要用在两个方面:

  1. 参与运算的量必须满足指定的类型,如求余运算要求运算符两侧的量均为整型量。
  2. 在函数调用时,因为要求实参和形参类型一致,因此可以用强制类型转换运算得到一个所需类型的参数。
#include
int main() {int n = 66;float f = 8.88;printf("%f\n", n + f);  //都转换成double型进行运算printf("%f\n", (float)n);   printf("%d\n", (int)f);return 0;
}

结果:
在这里插入图片描述

相关内容

热门资讯

[黑科技实测]“新星游炸金花辅... [黑科技实测]“新星游炸金花辅助开挂神器”!其实是有挂亲,新星游炸金花这个游戏其实有挂的,确实是有挂...
「玩家最新攻略」山西大唐麻将.... 「玩家最新攻略」山西大唐麻将.有挂吗亲,山西大唐麻将这个游戏其实有挂的,确实是有挂的,需要了解加客服...
实测教材" 皮皮湖南... 亲.皮皮湖南跑胡子这款游戏是可以开挂的,确实是有挂的,通过添加客服【3045033】很多玩家在这款游...
今日重大通报“顺欣茶坊有没有挂... 您好:顺欣茶坊这款游戏可以开挂,确实是有挂的,需要软件加微信【5951795】,很多玩家在顺欣茶坊这...
今日重大通报“中至江西麻将到底... 您好:中至江西麻将这款游戏可以开挂,确实是有挂的,需要软件加微信【69174242】,很多玩家在中至...