C语言中操作符及表达式(入门级超详细)(下)

简介: C语言中操作符及表达式(入门级超详细)(上)

++和--操作符

前边我们讲了++和--分为前置和后置两种

我们先看前置++和前置--

我们可以发现,前置++和前置--都是加1或者减1后再赋值

现在我们看后置++和后置--的区别

很明显,后置++和后置--是先赋值,后进行加1减1的操作


关系操作符

>        >=        <        <=      

!=(用于测试“不相等”)         ==(用于测试相等)

以上的操作符都比较简单,但是要注意在判断相等时两个等号不能只写一个。

逻辑操作符

&&        逻辑与

||        逻辑或

这里我们要分清楚按位与按位或和逻辑与逻辑或的区别

按位与按位或是与二进制有关的

而逻辑与逻辑或就是生活中我们常说的 或者 和  并且。在判断条件里通常会使用。

例如

int main()
{
  int a = 1;
  int b = 0;
  if (a && b)
  {
    printf("heihei\n");
  }
  return 00;
}

逻辑与的意思是操作符两边表达式的结果都必须为1,有一个为0则表达式结果为0。

很有用的是逻辑与操作符如果左边的表达式结果为0,右边就不会再判断了。

如图所示,Ret返回0,该判断式不管后边表达式为0还是1,都已经返回0,所以后边的函数没运行,运行结果也验证了我们的想法。

逻辑或就是操作符两边的表达式只要有一个为非0即可,这样判断结果就为1,除非两个结果都是零,那么该语句的返回结果就也是0。


接下来讲一讲条件操作符(三目操作符)很多时候可以让代码简单许多。有时候判断返回结果时非常好用。

格式为   exp1 ? exp2 : exp3

它是如何使用的呢?

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d", &a);
  if (a > 5)
    b = 3;
  else
    b = -3;
  printf("%d\n", b);
  return 0;
}
int main()
{
  int a = 0;
  int b = 0;
  scanf("%d", &a);
  (a > 5) ? (b = 3) : (b = -3);
  printf("%d\n", b);
  return 0;
}

运行后我们会发现这两段代码的作用是相同的,但明显第二种更加简洁,exp1是一个判断,如果exp1为真,则执行exp2,若为假,则执行exp3


表达式求值:

逗号表达式

表现形式为exp1,exp2,exp3,exp4,……

逗号表达式,顾名思义就是用逗号隔开的多个表达式。

逗号表达式,从左向右依次进行计算,整个表达式的结果是最后一个表达式的结果

我们可以举几个例子来更好地理解都好表达式的作用。


下标引用,函数调用和结构成员

1,[ ]下标引用操作符

下标引用操作符有两个操作数:数组名,索引值

int arr[10]
arr[9] = 10;

此时 [] 的两个操作数分别为 arr 和 9。

2,函数调用操作符()

接受一个或者多个操作数,第一个操作数是函数名,剩余的操作数都是传递给函数的参数

数组方面的知识可以在这里熟悉一下。

接下来我们直接看代码

void test1()
{
  printf("hehe\n");
}
void test2(const char *str)
{
  printf("%s\n", str);
}
int main()
{
  test1();//函数调用操作符。
  test2("hello world");
  return 0;
}

结构体成员访问操作符有两种

1,点操作符(.)形式为        结构体 . 成员名

2,箭头操作符(->)        结构体指针->成员名

代码演示

//首先我们要创建一个结构体
//假设是一个学生的信息
struct Stu
{
  char name[10];
  int age;
  char sex[5];
  double score;
};
void set_age1(struct Stu stu)
{
  stu.age = 18;
}
void set_age2(struct Stu* pstu)
{
  pstu->age = 18;
}
int main()
{
  struct Stu stu;//定义一个结构体名称
  struct Stu* pstu = &stu;
  stu.age = 20;
  set_agel(stu);
  pstu->age = 20;
  set_age2(pstu);//这里传过去的是地址
  return 0;
}

这里我们来说说表达式求值

注:表达式求值的顺序是由操作符的优先级和结合性决定

有些表达式的操作符在求值的过程中需要转换为其他类型。所以要了解了解隐式类型转换

       c语言的整型算术运算总是至少以缺省整型类型的精度来进行的,为了获取这个精度,表达式中的字符和短整型操作数在使用之前被转化为普通整型,这种转换被称为整型提升。之所以称为隐式,是因为这是编译器自己在后台完成的。

例如有三个char类型的数,在参与运算前都会被提升为普通整型,然后再执行运算。运算完成后再截断。

整型提升是按照变量的符号位进行

只要参加运算,就会产生整型提升, 只要参加运算,就会产生整型提升, 只要参加运算,就会产生整型提升。

💭我们来看这个例子

📑运行结果可以发现,c只要参与表达式运算,就会发生整型提升,表达式+c和-c就会发生整型提升,所以求出的是4个字节,但是sizeof(c)就是1个字节。

最后我们来讲一讲上面我们所说的操作符的优先级。(不需要刻意去记,记住某些常用的记好了)。

操作符的属性

复杂表达式的求值有三个影响的因素

1,操作符的优先性

2,操作符的结合性

3,是否控制求值顺序

运算符的优先性和结合性

这部分在不同编译器中有些复杂的表达式的优先级和结合性不同,同一表达式得出的结果也大不相同。

1.算术运算符的优先性

从上图看,我们发现()的优先级很高,所以我们可以用括号提高部分运算的优先级,就比如

a*(b+c),先进行加法计算再进行乘法计算。

2.算术运算符的结合性

当算术运算符的优先级相同时,结合方向为 从左向右

就比如:a+b-c

先进行a+b再进行减c操作。


优先级方面需要注意的是,&,^,|的优先级比== !=的优先级要低,所以这两种运算符共用时,要用括号括住才能得到正确结果。

例如

if ((x & y) == 0)

同大多数语言一样,C语言没有制定同一种运算符中多个操作偶数的计算顺序,例如

x= f() + g();

在该语句中,f函数可以在g函数前执行,也可以在g函数后执行,如果f函数修改了g函数中的变量,那么运算结果就会有所不同,为了保证特定的计算顺序,可以将函数的结果保存在变量之中。

类似的,C语言也没有规定函数各个参数的求值顺序。例如:

printf("%d %d", ++n, power(2, n));

先加加n还是先power,不同的编译器结果不同,取决于编译器如何对待该语句,解决办法就是把该语句修改为下边的语句。

n++;
  printf("%d %d", n, power(2, n));

函数调用,嵌套赋值语句,自增自减操作都有可能引发这样问题,在对表达式求值的同时,修改了某些变量的结果,在有执行顺序副作用的表达式中,执行结果与表达式中变量被修改的顺序之间有着微妙的依赖关系。

下边就也是一个例子

a[i] = i++;

在任何一种编译器上,代码的执行结果如果与求值顺序相关,那就都不是很好的陈旭设计风格,有必要在实践中多多联系,了解哪些问题需要解决需要避免,才能进一步成长,乾坤未定,你我皆是黑马,加油!

目录
相关文章
|
3月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
72 0
|
3月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
254 0
|
24天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
33 10
|
1月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
160 1
|
2月前
|
程序员 C语言
【C语言基础考研向】06运算符与表达式
本文介绍了C语言中的运算符分类、算术运算符及表达式、关系运算符与表达式以及运算符优先级等内容。首先概述了13种运算符类型,接着详细说明了算术运算符的优先级与使用规则,以及关系运算符和表达式的真假值表示,并给出了C语言运算符优先级表。最后附有课后习题帮助巩固理解。
104 10
|
1月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
169 0
|
2月前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
|
3月前
|
C语言
C语言------运算符与表达式
这篇文章是C语言运算符与表达式的实训教程,通过多个示例程序展示了如何使用算术运算符、关系运算符、逻辑运算符以及条件语句来解决实际问题,并介绍了如何通过函数库简化复杂数学运算。
C语言------运算符与表达式
|
3月前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
57 0
十一:《初学C语言》—  操作符详解(上)
|
6月前
|
存储 安全 编译器
【 c 语言 】赋值操作符详解
【 c 语言 】赋值操作符详解
252 0