【C语言航路】第五站:操作符(二)

简介: 【C语言航路】第五站:操作符(二)

七、关系操作符

关系操作符共有如下几种

==          //用于判断两个相等

!=        //用于判断两个不相等

>=        

<=

>

<

这些操作符都比较简单。只要满足条件,计算出来的是01,否则就是0。

警告:唯一需要注意的一点就是==和=号极其容易混淆,在这里要注意区分。否则就会出现一些不可预知的后果

八、逻辑操作符

1.基础知识

逻辑操作符有以下两种

&&        逻辑与         并且

||           逻辑或         或者

值得注意的是,这里不要与按位与和按位或进行了混淆。

&---按位与        

| ---按位或

这两个计算的是二进制的,而我们逻辑与和逻辑或就不关心二进制了,他们只关心真假。只要是0就是假,非0就是真。

对于a&&b而言:(只要有假就是假)

对于a||b而言:   (只要有一个为真,就是真)

关于这两个的运用,最经典的一个题目就是判断闰年的计算方式。这个在过去的文章中已经讲解了多次。这里也不再赘述

2.几道经典的题目

我们来看这样一段代码,并自己想出他的答案是多少?

include <stdio.h>
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}

有很多人第一反应毫无疑问就是1 3 4 5。这是一个经典的错误,标准的零分。那么正确的答案是什么呢?我们先运行一下

答案是1 2 3 4,那么这是为什么呢?为什么和我们的预期不一样呢?其实真正的原因是因为&&操作符左边只要为假,右边就无需进行计算下去了。类似于短路了。

而我们这道题正是符合了这个规则,a++,先引用,引用以后他是0,右边没必要进行计算下去了,但是a还是会+1的,所以最终答案就是1 2 3 4

那么如果我们将题目进行修改呢?会发生什么事情呢?

include <stdio.h>
int main()
{
    int i = 0,a=1,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}

此时我们会发现,a不在是1,后面的逻辑与都可以继续判断下去,所以最终答案就是2 3 3 5

那么如果代码改为了||呢?又是如何呢?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int i = 0, a = 1, b = 2, c = 3, d = 4;
    //i = a++ && ++b && d++;
    i = a++||++b||d++;
    printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
    return 0;
}

我们运行一下

这里又为什么是2 2 3 4了呢?又发生了什么呢?其实这是因为,a一开始是1,先引用了这个1,后面的其实无需在进行判断了,因为已经恒为真了。所以只有a会+1.其余都不会改变,因此答案就是2 2 3 4,像这种现象,有的时候称作短路

我们继续看这段代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int i = 0, a = 0, b = 2, c = 3, d = 4;
    //i = a++ && ++b && d++;
    i = a++||++b||d++;
    printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
    return 0;
}

这下相信大家不会在出现错误了,答案是1 3 3 4

九、条件操作符

exp1?exp2:exp3

这个语句的意思是,如果1为真,则执行2,3不执行;如果1为假,则执行3,2不执行。这也称作三目操作符

我们直接来举一个例子:求两个数中的较大数

这个比较简单,我们直接给出代码

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  int ret = a > b ? a : b;
  printf("%d", ret);
  return 0;
}

十、逗号表达式

exp1, exp2, exp3, …expN

这个表达式又什么用呢?这个表达式的作用是从左到右依次进行计算,但是最终的计算结果是最后一个表达式的值。

我们看这样一个代码

#include<stdio.h>
int main()
{
  int a = 1;
  int b = 2;
  int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式
  pritf("%d %d %d", a, b, c);
  return 0;
}

计算结果为 12 13 13

十一、下标引用、函数调用和结构成员

1. [ ] 下标引用操作符

操作数:一个数组名 + 一个索引值

我们看这样一段代码

#include<stdio.h>
int main()
{
  int arr[10] = { 1,2,3,4 };
  printf("%d", arr[3]);//[]就是下标引用操作符
  return 0;
}

该代码中,[]就是一个下标引用操作符,而他的操作数就是arr和3

2.函数调用操作符

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

我们看这样一段代码

#include<stdio.h>
#include<string.h>
int main()
{
  int len = strlen("abcdef");//()就是函数调用操作符号,操作数就是strlen和"abcdef"
  return 0;
}

这段代码中()就是函数调用操作符号,操作数就是strlen和"abcdef",所以我们还能看出一个结论,函数调用操作符至少有一个操作数

3.访问一个结构体成员

.        结构体.成员名

->     结构体指针->成员名

我们来举一个例子,请看如下所示代码

#include<stdio.h>
struct BOOK
{
  char name[20];
  char author[20];
  int price;
};
void Print(struct BOOK* p)
{
  printf("%s %s %d\n", (*p).name, (*p).author, (*p).price);
  printf("%s %s %d\n", p->name, p->author, p->price);
}
int main()
{ 
  struct BOOK b1 = { "信号与系统","吴大正",50 };
  struct BOOK b2 = { "数据结构","王卓",66 };
  printf("%s %s %d\n", b1.name, b1.author, b1.price);
  printf("%s %s %d\n", b2.name, b2.author, b2.price);
  Print(&b1);
}

这段代码有四种不同结构体打印方式,运行结果如下

还有一个经典的例子是这样的,请看这段代码

#include <stdio.h>
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_age1(stu);
  printf("%d\n", stu.age);
  pStu->age = 20;//结构成员访问
  set_age2(pStu);
  printf("%d\n", stu.age);
  return 0;
}

这段代码的运行结果为

原因是,第一个是传值调用,是一份临时拷贝,所以不会修改原来的值

第二个是传址调用,可以修改原来的值


总结

本节主要讲解了关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用,函数调用,结构体成员访问操作符的相关知识。如果对你有帮助,不要忘记点赞加收藏哦!!!

本站未完,欲知后事,请看下节

相关文章
|
3月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
72 0
|
3月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
237 0
|
14天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
30 10
|
1月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
152 1
|
1月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
163 0
|
3月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
45 6
|
3月前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
56 0
十一:《初学C语言》—  操作符详解(上)
|
4月前
|
C语言
五:《初学C语言》— 操作符
本篇文章主要讲解了关系操作符和逻辑操作符并附上了多个代码示例
43 1
五:《初学C语言》—  操作符
|
5月前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
|
5月前
|
算法 C语言
【C语言】:巧用移位操作符,位操作符解决问题
【C语言】:巧用移位操作符,位操作符解决问题
35 0