文章目录
C语言中支持下面4种类型的运算
运算类型 | 运算符 |
四则运算 | +,-,*,/,% |
关系运算 | <,>,<=,>=,==,!= |
逻辑运算 | &&,||,! |
位运算 | &,|,^,>>,<<,~ |
注意:
C语言中的除法运算,其除数不能为0
下面通过一段程序感受一下:
#include <stdio.h>
int main()
{
int a = 5;
int b = 2;
double c = 3;
c = a / b;
printf("c = %f\n", c);
c = a % b;
printf("c = %f\n", c);
return 0;
}
下面为输出结果:
通过上面的代码,可以得到一些小结论:
如上面的图片所示,c 的值就为0
下面通过一段代码,感受一下:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 3;
c = a != b;
printf("c = %d\n", c);
c = a - b >= a + b;
printf("c = %d\n", c);
c = (a < b) + (c < b);
printf("c = %d\n", c);
return 0;
}
下面为输出结果:
小技巧:如果不同类型的运算同时出现在一个表达式中,那么尽量使用括号()指明运算顺序。
下面看一段代码,深入感受一下运算优先级:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = a != b + a * b;
printf("c = %d\n", c);
return 0;
}
下面为输出结果,可以看出,c 的输出结果为1,为什么为1呢?这是由于乘法优先级大于加法优先级大于关系运算优先级,所以程序执行过程是这样,先计算 a * b,然后将 a * b 的结果 2 加上 b,得到4,最后再比较 a != 4,得到的结果当然为1啦,我们还可以通过反汇编来观察代码的执行过程。
所以如果想得到a != b 再加上 a * b的结果,一定要记得加括号,如下:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = (a != b) + (a * b);
printf("c = %d\n", c);
return 0;
}
这样才能得到正确结果,如下所示:
小结:
左操作数 | 右操作数 | 结果 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
左操作数 | 右操作数 | 结果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
话不多说,上代码:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = a && b;
printf("c = %d\n", c);
c = !(a - b) || (c < b);
printf("c = %d\n", c);
c = 10000;
c = !!c;
printf("c = %d\n", c);
return 0;
}
下面为运行结果:
运算符 | 含义 | 示例 | 优先级 |
~ | 按位求反 | ~0101 -> 1010 | 1(高) |
<< | 左移:高位移出,低位补0 | 0011 << 1 -> 0110 | 2 |
>> | 右移:低位移出,高位补符号位 | 0101 >> 2 -> 0001 | 2 |
& | 按位与 | 0111 & 1100 -> 0100 | 3 |
^ | 按位异或:相同为0,不同为1 | 0111 ^ 1100 -> 1011 | 4 |
| | 按位或 | 0111 | 1100 -> 1111 | 5(低) |
注:
1.按位与和逻辑与的计算法相同:两者为1,结果为1,否则为0
2.按位或和逻辑或的计算法相同:两者为0,结果为0,否则为1
代码如下:
#include <stdio.h>
int main()
{
printf("c = %d\n", 5 | 2);
printf("c = %d\n", 7 ^ 8);
printf("c = %d\n", 2 ^ 3);
printf("c = %d\n", (15 >> 2) & 13);
printf("c = %d\n", 173 ^ 60);
return 0;
}
运行结果如下:
这里需要特别注意:对某一位或者某几位取反可以用异或(^)运算,这在工程里常用!!!
如下面的一段代码:
short a = 1; int b = 4; int c = a | b; printf("c = %d\n",c);
b为int类型,占4个字节,a为short类型,占2个字节。所以a要先要补符号位,由于a是正数,所以补0,这样就可以进行位运算了,得出c的结果为5。
下面来看一段代码:
#include <stdio.h>
int main()
{
short a = 1;
short b = 2;
int c = a - b;
c = c >> 4;
printf("c = %d\n", c);
c = c * -1 * 16 >> 4;
printf("c = %d\n", c);
printf("c = %d\n", 16 << 2);
return 0;
}
下面为输出结果:
再看一段代码:
#include <stdio.h>
int main()
{
char c = 'A';
short a = c;
int b = c;
printf("c = %c\n", c);
printf("c = %d\n", c);
printf("a = %d\n", a);
printf("b = %d\n", b);
c = 0x40;
printf("c = %x\n", c);
printf("c = %d\n", c);
c = c << 1;
printf("c = %d\n", c);
c = c << 1;
printf("c = %d\n", c);
return 0;
}
下面为输出结果:
需要注意的是,因为c为char类型,所以64左移1位后,用二进制表示为1000 0000,最高位的1表示符号位,所以就是-128。
文章浏览阅读2.3k次。有时候用第三方加固平台加固以后会让我们重新签名。还有就是上应用市场的时候,如果以前该应用已经在市场上上传过了,由于后面业务原因换了开发者账号再去上传就会提示我们去认领一个没有签名的包(unsign.apk),然后去签名上传进行MD5签名验证,如下图看到上面的提示不要慌,不就是加个签名么,apksigner就是SDK自带的签名工具,处于F:\android-sdk\build-tools\xxx目录下将上面的路径配置到系统环境变量path中,打开cmd,切换到unsign.apk目录下,建议.._apksigner 签名
文章浏览阅读1.3k次。背景 一般情况下,在Java中你可以通过get方法轻松获取beans中的属性值。但是,当你事先不知道beans的类型或者将要访问或修改的属性名时,该怎么办?Java语言中提供了一些像java.beans.Introspector这样类,实现了在运行时检测Java类并确定属性get和set方法的名称,结合Java中的反射机制就可以调用这些方法了。然而,这些APIs使用起来比较_propertyutils.snaketoline(field.getname());
文章浏览阅读536次。Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.Example 1:Input:"bbbab"Output:4One possible longest palind_leetcode longestpalindromesubseq连续字符不想等,长度为偶的回文子序列长度
文章浏览阅读189次。本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点自定义加载进度条Android自定义View之手把手带你自定义一个进度条上次我们已经把实线和虚线都绘制好了,这次我们就主要来解决更新的问题:怎么随着时间的推移逐渐地绘制进度条怎么在绘制的过程中加速进度条的绘制首先我们来解决第一个问题,也就是随着时间更新我们的..._setvalueinterpolator
文章浏览阅读5.7k次。来源:https://www.cnblogs.com/cyq1162/p/3841766.html下载地址: https://github.com/cyq1162/cyqdata/blob/master/Tool/JsonSplit.cs https://github.com/cyq1162/cyqdata using System;using System.C..._c#判断是json还是xml
文章浏览阅读992次。python读取eml文件并用正则匹配邮箱_python 如何查看eml文件
文章浏览阅读2.5k次。今天闲来无事,就研究了一下Jquery的DataTables插件。感觉效果不错,支持排序和内容过滤(查询),在这里向大家推荐一下^_^不得不说之前犯了一个错误,这个插件应该叫做DataTable,而我把它当成了tablesort,实在不好意思。。。。。可以直接到官网上去下载下来,单击http://www.datatables.net/到官网上看看,什么API、demo之类的_jquery datatables 英文
文章浏览阅读8.5k次,点赞8次,收藏11次。逆序对什么是逆序对呢?百度百科这样解释:设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。定义:对于一个包含N个非负整数的数组A[1…n],如果有i < j,且A[ i ]>A[ j ],则称(A[ i] ,A[ j] )为数组A中的一个逆序对。例如,数组(3_逆序对
文章浏览阅读1.2k次。SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达、IMU、麦克风、音响、摄像头这些通用部件可以直接买到,很难买到通用的底盘。一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的;另一方面是因为底盘包含软硬件整套解决方案,是很多机..._slam 实战
文章浏览阅读89次。#6010. 「网络流 24 题」数字梯形题目描述给定一个由n nn行数字组成的数字梯形如下图所示。梯形的第一行有m mm个数字。从梯形的顶部的m mm个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径。分别遵守以下规则:从梯形的顶至底的m mm条路径互不相交;从梯形的顶至底的m mm..._7-60 数字梯形 (110 分) 给定一个由n行数字组成的数字梯形如下图所示。梯形的第一
文章浏览阅读2.2k次。背景介绍:由于在Ubuntu16.04系统上安装RTX 3090显卡驱动有点吃力(各种Error和不兼容),使用最新Ubuntu20.04系统搭配最新的RTX 3090显卡配置最新的Pytorch【(*^▽^*)】前期准备: 1、Ubuntu20.04下载:Ubuntu20.4_amd64_desktop.iso 2、UNtebootin光盘刻录软件下载:unetbootin,选择Windows下载 3、NVID..._2080ti ubuntr20.04
文章浏览阅读329次。一.添加Spring 、Struts框架对web.xml文件的修改1. 添加Spring框架2. 在web.xml中引入Spring配置文件(注意:applicationContext.xml文件的路径)context-param> param-name>contextConfigLocationparam-name> param-v_struts+spring+ibatis