C语言小技巧两个感叹号(两个!)妙用

yumo6662周前 (09-06)技术文章4

两个!是为了把 非0值 转换成1,而0值还是0。因为C语言中,所有 非0值 都表示真。所以!非0值 = 0,而!0 = 1。所以!!非0值 = 1,而!!0 = 0。

看看下面的真值表:

看看实例代码

int avcodec_is_open(AVCodecContext *s)
{
return !!s->internal;
}

如此,便把指针是否为空以0和1的形式表示了出来。

以前当我需要把一个字节或者一个int数据要用bit来区分两种含义的时候,假设一个字节变量 byte,可代表范围 0~255,0 代表false,1 ~255 代表true,我可能是这么写程序的

BYTE Byte2Bit(BYTE byte)

{

BYTE bit;
if(byte == 0)

{

bit = 0;

}

else

{

bit = 1;

}

return bit;

}

或者是

BYTE Byte2Bit(BYTE byte)

{

return (byte ? 1 : 0);

}

学会这个小技巧之后,我们再看看以上代码,是不是即臃肿又低效?因为以上程序需要用到判断,但是如下写的话,汇编一条指令就搞定。

BYTE Byte2Bit(BYTE byte)

{

return !!byte;

}

这样,不管原先 byte 是什么值,函数Byte2Bit运行结束都将返回 0 或 1。优雅又高效,这不正是程序员毕生的追求嘛,毕竟优雅永不过时!

相关文章

「初识C语言」编译过程_c语言编译过程详解

C语言编译过程认识C编译执行过程,是C学习的开端。我们来简单说C语言从编码编译到执行要经历一下过程:C源代码编译---->形成目标代码,目标代码是在目标机器上运行的代码。连接---->将目...

C语言模块程序设计?源文件和头文件如何划分模块?linux C第32讲

6 .c源文件和.h头文件配合使用假设我们开发一个图书馆管理系统,读者的信息使用reader.c和reader.h文件来管理,那么,读者在登记的时候,需要输入年龄,那么,可以设计如下的函数,接收登记读...

C程序设计之:1-1/2+1/3-... + 1/n 的和

求:1 - 1/2 + 1/3 - .... + 1/n 的和。和这道题不同的是,该题目里面,偶数项是负数,奇数项是正数。#include <iostream> using namespa...

C语言也可以制作视频播放器?只需5分钟即可制作一个自己的播放器

上一节简要的介绍了如何编写C语言程序调用 FFmpeg 库,读取视频文件,并将之逐帧转换为 ppm 图片,最后通过 save_frame() 函数将转换后的 ppm 图片保存到磁盘。本节将在上一节的基...

一起学《C程序设计》第六课——数组、字符串及实战练习

在之前的第三课中学习了基本数据类型,第五课学习了循环结构程序,做练习的时候处理的是一些有规律的数据,比如1~100的正整数,而当我们面对一堆没有规律的数据时该怎么去循环处理呢?把数据组合在一起构成一个...

每天一道c语言编程题,第四题(c语言经典 求素数)

编写一个程序,输入一个整数n,输出n以内的所有素数。#include <stdio.h>int main() { int n, i, j, flag; printf("请输入一...