【C语言基础入门】2.C语言中四则运算、关系运算、逻辑运算与位运算 |
您所在的位置:网站首页 › 符号运算法则 › 【C语言基础入门】2.C语言中四则运算、关系运算、逻辑运算与位运算 |
文章目录 一、概述 二、四则运算(+,-,*,/,%) 三、关系运算(,=,==,!=) 四、逻辑运算与位运算 五、深度剖析位运算 一、概述C语言中支持下面4种类型的运算 运算类型运算符四则运算+,-,*,/,%关系运算,=,==,!=逻辑运算&&,||,!位运算&,|,^,>>, 关系运算 > 赋值操作) 四则运算 正负号 > 乘除运算 > 加减运算关系运算 大小比较运算 > 相等比较运算赋值操作下面看一段代码,深入感受一下运算优先级: #include 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 int main() { int a = 1; int b = 2; int c = 0; c = (a != b) + (a * b); printf("c = %d\n", c); return 0; }这样才能得到正确结果,如下所示: 小结: 整型数除法有两种:取商(/),取余(%)浮点数除法与数学中除法运算相同,结果为浮点数不同运算的优先级不同,可使用括号改变运算优先级同一个表达式中应避免不同的运算类型(四则运算,关系运算) 四、逻辑运算与位运算 逻辑运算(&&,ll,!) 逻辑运算的参与者为逻辑值(真或假)任何非零值在逻辑运算中都为真任何零值在逻辑运算中都为假 &&运算 左操作数右操作数结果000010100111 ||运算 左操作数右操作数结果000011101111 逻辑运算中的短路法则 对于&&运算 从左向右进行,如果有一个操作数为假,则整个表达式为假第一个为假的操作数之后的其它操作数不再计算对于||运算 从左向右进行,如果有一个操作数为真,则整个表达式为真第一个为真的操作数之后的其它操作数不再计算取非运算(!) 单目运算(只需要一个操作数),运算结果为逻辑值 对真值取非的结果为假对假值取非得结果为真话不多说,上代码: #include 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; }下面为运行结果: 注: 1.按位与和逻辑与的计算法相同:两者为1,结果为1,否则为0 2.按位或和逻辑或的计算法相同:两者为0,结果为0,否则为1 位运算实例 将整数5的第2个二进制位置1将整数7的第4个二进制位取反将整数2的最后两位取反将整数15右移2位,再将第2个二进制位置0设变量a的二进制数是10101101,若想通过运算a ^ b使得a的中间4位取反,其余位不变,则b的值是多少?代码如下: #include 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; }运行结果如下: 这里需要特别注意:对某一位或者某几位取反可以用异或(^)运算,这在工程里常用!!! 运算优先级(优先级从上到下为由高到低) 正负号>逻辑非>按位取反乘除>加减>按位左右移大小比较运算>相等比较运算按位与>按位异或>按位或逻辑与>逻辑或赋值操作 小结 逻辑运算中有特殊的短路法则,结果确定后不再向下计算C语言中的真值对应非零值,假值对应零值位运算直接对数据的二进制位进行操作位运算的操作数只能是整型数(浮点数不能直接进行位运算) 五、深度剖析位运算 不同类型的本质在于: 占用的内存大小不同,如:short占用2字节,int占用4字节表示具体数据的方式不同 正整数用原码表示,负整数用补码表示整数型和浮点型的二进制表示不同位运算时需要明确的知道的事 操作数的类型(占用的内存大小)操作数是正数还是负数(符号位,数据表示)不同类型的操作数先自动对齐再进行位运算(补符号位)如下面的一段代码: 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 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 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |