关系/条件/逻辑~操作符

简介: 关系/条件/逻辑~操作符

1.关系操作符

C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称

为“关系运算符”(relational operator),主要有下⾯6个。


• > ⼤于if (x == 3) {

printf("x is 3.\n");

}符

• < ⼩于运算符

• >= ⼤于等于运算符

• <= ⼩于等于运算符

• == 相等运算符

• != 不相等运算符


关系表达式通常返回 0 或 1 ,表⽰真假。

C 语⾔中, 0 表⽰假,所有⾮零值表⽰真。⽐如, 20 > 12 返回 1 , 12 > 20 返回 0 。关系表达式常⽤于 if 或 while 结构。如:


if (x == 3) {
 printf("x is 3.\n");
}


注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写

出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果,如:


if (x = 3) ...


这样的话,如果把 == 误写成 = ,编译器就会报错。


另⼀个需要避免的错误是:多个关系运算符不宜连⽤。

如下面案例:


(i < j) < k//这种写法是错误的
i < j && j < k//这种是正确的


比如说:我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。


#include <stdio.h>
int main()
{
  int age = 0;
  scanf("%d", &age);
  if(18<=age<=36)
  {
  printf("⻘年\n");
 }
 return 0;
}//输入10,结果为:青年


,我们先拿18和age中存放的10⽐较,表达式18<=10为假, 18<=age 的结果是0,再拿0和

36⽐较,0<=36为真,所以打印了 ⻘年


2.条件操作符(c语言唯一3目操作符)

条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:


exp1 ? exp2 : exp3


条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果

exp1 为假, exp3 计算,计算的结果是整个表达式的结果。

如:


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


3. 逻辑操作符:&& , || , !

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符:


• ! :逻辑取反运算符(改变单个表达式的真假)。

• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。


注:C语⾔中,⾮0表⽰真,0表⽰假

逻辑取反运算符

fb70100c4987437d943e80e997e81ef1.png

下面例子:


#include <stdio.h>
int main()
{
  int flag = 0;
  if(!flag)
  {
  printf("do something\n");
 }
 return 0;
}


如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真

所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。


4. 短路

C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是

保证的。


如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

如前⾯的代码:


if(month >= 3 && month <= 5)


如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。

所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。


像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短

路求值。

int i = 0,a=0,b=2,d=4;


i = a++ || ++b || d++;//计算代码输出的结果

//结果为a=1,b=3,d=4
原因:a是使用在++,所以第一个||左边为0,即假,第一个||又边为真,第2个||后面不用计算,所以d不用加。


算数操作符:+、-、*、/、%

/

运算符 / ⽤来完成除法。

除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。


#include <stdio.h>
int main()
{
  float x = 6 / 4;
  int y = 6 / 4;
  printf("%f\n", x); // 输出 1.000000
  printf("%d\n", y); // 输出 1
  return 0;
}


上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是

1.5 。原因就在于 C 语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。

如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。

#include <stdio.h>
int main()
{
 float x = 6.0 / 4; // 或者写成 6 / 4.0
 printf("%f\n", x); // 输出 1.500000
 return 0;
}


上⾯⽰例中, 6.0 / 4 表⽰进⾏浮点数除法,得到的结果就是 1.5 。

再看⼀个例⼦:


#include <stdio.h>
int main()
{
 int score = 5;
 score = (score / 20) * 100;
 return 0;
}


上⾯的代码,你可能觉得经过运算, score 会等于 25 ,但是实际上 score 等于 0 。这是因为

score / 20 是整除,会得到⼀个整数值 0 ,所以乘以 100 后得到的也是 0 。

为了得到预想的结果,可以将除数 20 改成 20.0 ,让整除变成浮点数除法。

%

运算符 % 表⽰求模运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数。


相关文章
|
关系型数据库 MySQL API
|
监控 算法
偏最小二乘(Partial Least Squares,PLS)原理及模型建立
偏最小二乘(Partial Least Squares,PLS)原理及模型建立
偏最小二乘(Partial Least Squares,PLS)原理及模型建立
|
弹性计算 JavaScript 应用服务中间件
在一台ECS服务器上优雅部署多环境:实践攻略
在ECS上部署多环境应用,通过Nginx反向代理实现。规划端口或子域名区分开发、测试和生产环境。配置应用监听不同端口,如Node.js应用修改启动脚本。【6月更文挑战第21天】
452 3
|
运维 监控 Devops
DevOps实践:持续集成与持续部署的黄金路径
在数字化时代,快速迭代和高质量软件交付成为企业竞争的核心。本文深入探讨了DevOps文化下,持续集成(CI)与持续部署(CD)的最佳实践,旨在为读者提供一套实现高效、自动化的软件发布流程的方法论。通过分析现代软件开发的挑战,结合具体案例,本文详细阐述了如何构建一个灵活、高效的CI/CD流水线,以及如何利用监控和反馈机制不断优化这一过程。文章不仅适合运维人员阅读,同时也为软件开发者和项目经理提供了宝贵的参考。
205 27
|
JSON Java 测试技术
Jmeter接口压测示例
Jmeter接口压测示例
453 0
|
11月前
|
存储 缓存 测试技术
golang slice相关常见的性能优化手段
【10月更文挑战第23天】本文介绍了 Go 语言中切片使用的四个优化技巧:预分配容量、减少中间切片的创建、利用切片的复用特性和合理使用 `copy` 函数。通过这些方法,可以有效提高程序性能,减少不必要的内存分配和数据复制操作。每个技巧都附有详细的原理说明和代码示例,帮助开发者更好地理解和应用。
182 2
|
11月前
|
消息中间件 SQL 分布式计算
大数据-62 Kafka 高级特性 主题 kafka-topics相关操作参数 KafkaAdminClient 偏移量管理
大数据-62 Kafka 高级特性 主题 kafka-topics相关操作参数 KafkaAdminClient 偏移量管理
131 6
|
测试技术
深入白盒测试:静态分析与动态测试的融合策略
【4月更文挑战第23天】 在软件测试领域,白盒测试以其对内部结构的透明性著称。本文将探讨如何通过结合静态分析和动态测试的方法来强化白盒测试的效能。我们将详细讨论这种融合策略的优势、实施步骤以及可能面临的挑战,并通过案例分析展示其在实际中的应用效果。
194 1
|
Rust 开发者
Rust函数入门与函数重载
Rust函数入门与函数重载
252 0