!x是逻辑非运算符,只关心x是否为零,0变为1,否则变为0;而~(x)是位反转运算符,将x每个二进制位反转,0变为1,1变为0,结果可能涉及补码计算。
C语言中!x
和~(x)
可不一样,虽然它们看起来都像是在做某种“反转”,但实际上作用的位级细节和结果大相径庭。 这可不是简单的真假翻转那么容易糊弄过去。
先说说!x
。这货是逻辑非运算符,它只关心x
是不是零。 如果x
是零,!x
就返回1(真);否则,!x
返回0(假)。 注意,这里说的零,指的是数值零,不是什么空指针或者其它奇奇怪怪的东西。 这玩意儿只对布尔值(或者说能隐式转换成布尔值的表达式)才有意义,它根本不关心x
的二进制表示。
再来看~(x)
。 这是位反转运算符,它会对x
的每一个二进制位进行反转。 0变成1,1变成0。 这才是真正的“反转”。 举个例子,如果x
是10(二进制1010),那么~(x)
就是-11(二进制补码表示为11111111111111111111111111110101,假设是32位整数)。 你看,结果完全不同。 这其中涉及到补码表示,一个整数的二进制表示和它的负数的二进制表示之间是通过取反加一的关系来转换的。
所以,你要是想判断一个变量是不是零,!x
是你的好伙伴;但如果你需要对变量的每个比特位进行反转操作,那~(x)
才是你的选择。 别搞混了,这俩玩意儿虽然都带个感叹号或者波浪线,但它们是完全不同的运算符,作用于不同的层面,结果自然也大相径庭。
再深入一点,从性能角度看,!x
通常比~(x)
效率更高,因为!x
只需要检查x
是否为零,而~(x)
需要对每个比特位进行操作。 编译器可能会进行优化,但原则上!x
的计算开销更小。
还有一些需要注意的点:
-
!x
的返回值是布尔值(0或1),而~(x)
的返回值是整数,类型与x
相同。 - 对于无符号整数,
~(x)
的结果是该整数在该类型范围内的位反转结果。 对于有符号整数,结果会涉及到补码的计算,可能导致结果看起来与直觉不符。 这是很多初学者容易踩的坑。 要理解补码的原理才能避免这些误解。
最后,记住:代码要写得清晰易懂,别为了追求所谓的“简洁”而牺牲可读性。 选择合适的运算符,并写上清晰的注释,让你的代码更易于理解和维护。 这才是真正的编程大牛之道。
以上是C语言中 !x 和 ~(x) 一样吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

VScode中怎么配置C语言环境?下面本篇文章给大家介绍一下VScode配置C语言环境的方法(超详细),希望对大家有所帮助!

在C语言中,node是用于定义链表结点的名称,通常在数据结构中用作结点的类型名,语法为“struct Node{...};”;结构和类在定义出名称以后,直接用该名称就可以定义对象,C语言中还存在“Node * a”和“Node* &a”。

c语言将数字转换成字符串的方法:1、ascii码操作,在原数字的基础上加“0x30”,语法“数字+0x30”,会存储数字对应的字符ascii码;2、使用itoa(),可以把整型数转换成字符串,语法“itoa(number1,string,数字);”;3、使用sprintf(),可以能够根据指定的需求,格式化内容,存储至指针指向的字符串。

在c语言中,没有开根号运算符,开根号使用的是内置函数“sqrt()”,使用语法“sqrt(数值x)”;例如“sqrt(4)”,就是对4进行平方根运算,结果为2。sqrt()是c语言内置的开根号运算函数,其运算结果是函数变量的算术平方根;该函数既不能运算负数值,也不能输出虚数结果。

C语言数组初始化的三种方式:1、在定义时直接赋值,语法“数据类型 arrayName[index] = {值};”;2、利用for循环初始化,语法“for (int i=0;i<3;i++) {arr[i] = i;}”;3、使用memset()函数初始化,语法“memset(arr, 0, sizeof(int) * 3)”。

c语言合法标识符的要求是:1、标识符只能由字母(A~Z, a~z)、数字(0~9)和下划线(_)组成;2、第一个字符必须是字母或下划线,不能是数字;3、标识符中的大小写字母是有区别的,代表不同含义;4、标识符不能是关键字。

c语言编译后生成“.OBJ”的二进制文件(目标文件)。在C语言中,源程序(.c文件)经过编译程序编译之后,会生成一个后缀为“.OBJ”的二进制文件(称为目标文件);最后还要由称为“连接程序”(Link)的软件,把此“.OBJ”文件与c语言提供的各种库函数连接在一起,生成一个后缀“.EXE”的可执行文件。

区别:1、表示的含义不同,“*p”表示此指针指向的内存地址中存放的内容,“p”表示一个指针变量的名字,指此指针变量所指向的内存地址。2、输出的格式不同,“*p”输出的一般是一个和指针类型一致的变量或者常量,“p”输出的是一个16进制数, 输出一个指针的地址。3、功能不同,“*p”是让程序去那个地址取出数据,“p”用于存放的是地址。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

SublimeText3 Linux新版
SublimeText3 Linux最新版