learn_C_deep_10 深刻认识C语言重点操作符

这篇具有很好参考价值的文章主要介绍了learn_C_deep_10 深刻认识C语言重点操作符。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

注释符号

其他注释方法

注释建议

接续符和转义符

在续行符\之前或者之后带上空格,行不行?

\n:换行符与\r:回车符之间的区别

两个小程序(旋转光标、倒计时)

单引号和双引号

​'abcd'这样写有问题吗?

特殊情况

为何计算机需要字符

逻辑运算符

短路

位运算符

&& vs &、|| vs |的区别

关于^的理解

通过异或交换两个整数

注释符号

        在C语言中,注释指的是在程序代码中添加的一些说明或标记,这些注释并不会被编译器解析和执行,仅仅是为了帮助程序员更好地理解代码。

C语言中支持两种注释方式:

1. 单行注释:使用“//”符号标记注释内容,从“//”开始到该行结尾处都被视为注释,编译器会忽略这些内容。

例如:

learn_C_deep_10 深刻认识C语言重点操作符

2. 多行注释:使用“/*”和“*/”符号包含多行注释内容,从“/*”开始到“*/”结束的所有内容都被视为注释,编译器会忽略这些内容。

例如:

learn_C_deep_10 深刻认识C语言重点操作符

注释是一种很重要的编程技巧,它可以增强代码的可读性和可维护性,方便其他人或自己在之后修改代码。

#include<stdio.h>
int main()
{
	int /* */ i; //正确
	char* s = "abcd //xyz"; //正确
	//Is it a\
	valid comment? //正确
	in/* */t j; //报错
	return 0;
}

learn_C_deep_10 深刻认识C语言重点操作符

注意:注释被替换,本质是替换成空格。

learn_C_deep_10 深刻认识C语言重点操作符

# 和 define之间是可以带空格的。

learn_C_deep_10 深刻认识C语言重点操作符

1.c语言风格注释无法嵌套

2./*总是与离它最近的*/匹配

learn_C_deep_10 深刻认识C语言重点操作符

其他注释方法

//基于条件编译,代码编译期间处理
#include <stdio.h>
#define MONEY 0
int main()
{
#if MONEY
	printf("for test1\n"); //test1
	printf("for test2\n"); //test2
#endif
	return 0;
}

//基于if判断,代码运行期间处理
#include <stdio.h>
int main()
{
	//if (0)注释方法
	if (0) {
		printf("for test1\n"); //test1
		printf("for test2\n"); //test2
	}
	return 0;
}

注释建议

        复杂的函数中,在分支语句、循环语句结束之后需要适当的注释,方便区分各分支或循环体。

learn_C_deep_10 深刻认识C语言重点操作符

接续符和转义符

        在C语言中,续行符和转义符都是用来对特殊字符进行处理和表示的。它们的作用与用途是不同的,下面我来简单解释一下:

1. 续行符

续行符是用来将一行过长的代码分割成多行的特殊字符,以便于阅读和编写。在C语言中,续行符使用反斜线符号“\”来表示,用在需要跨行的地方的末尾处。

例如:

learn_C_deep_10 深刻认识C语言重点操作符

 使用续行符后,上面的代码可以分为三行来编写,其结果和不使用续行符的代码是一样的。

2. 转义符

转义符是用来表示一些特殊字符的符号。在C语言中,转义符使用反斜线符号“\”配合后面的字符来表示,常用的转义符有:

- \n:表示换行符
- \t:表示制表符
- \r:表示回车符
- \0:表示字符串结束标志符

需要注意的是,在字符串中使用引号时,需要使用转义符来表示引号自身,例如:

learn_C_deep_10 深刻认识C语言重点操作符

 上面的代码使用了转义符“\”来表示引号自身,因为在字符串中使用引号会引起歧义。

在续行符\之前或者之后带上空格,行不行?

learn_C_deep_10 深刻认识C语言重点操作符

C中,有一些字符,就是他的字面意思,比如'n','b','t'。

也有一些字符,本身就是特殊含义的,比如:" , ', \

转义的本质含义是:字面转特殊,或者特殊转字面。

learn_C_deep_10 深刻认识C语言重点操作符

        在第6行中,出现了一个编译错误,因为在printf函数中缺少一个右括号)。该行代码的目的是要输出一个双引号,但是,由于双引号也是C语言中的特殊字符,因此需要在前面加上一个反斜杠\,来表示它是一个字面量,而不是代码中的引号。

        在第7行中,出现了一个特殊字符转义序列\",它表示输出一个双引号。

        在第8行中,使用了特殊字符转义序列\n,它表示输出一个换行符。

        在第9行中,使用了特殊字符转义序列\t,它表示输出一个制表符。

\n:换行符与\r:回车符之间的区别

        在计算机文本文件中,"\n"代表换行符(Line Feed),通常被译为"新行"。而"\r"代表回车符(Carriage Return),通常被译为"回车"。

        在早期的打印机、终端设备中,换行和回车都是必须的操作。当需要让打印头或光标移动到下一行的开头时,需要先执行回车操作,然后再执行换行操作。这种习惯一直延续下来,即"回车+换行"的序列被用作一个行的结束和下一行的开始标志。

        但是在现代的计算机系统中,通常只需要用到换行符。因此,当我们在Windows系统中使用记事本编辑文本文件时,换行符和回车符会被同时输出,但是在其他平台上,如Linux、Mac等,只会输出换行符。

learn_C_deep_10 深刻认识C语言重点操作符

        简单来说,换行符是让光标移到下一行的开头,而回车符是让光标移到本行的开头。但是,现在通常只需要用换行符就可以了。

两个小程序(旋转光标、倒计时)

旋转光标

#include<stdio.h>
#include<windows.h>
#include<string.h>
int main()
{
	int index = 0;
	const char* label = "|/-\\";//由于\是特殊字符,需要转义成字面字符
	//printf("%d\n", strlen(label));//4 - 个字符
	while (1)
	{
		index %= 4;
		printf("[%c]\r", label[index]);
		index++;
		Sleep(1000);
	}
	return 0;
}

        这段代码是一个简单的命令行动画,通过不断地输出字符 "|/-\\" 实现一个不断旋转的动画效果。具体来说:

1. 在 main 函数中定义变量 index,用于表示当前应该输出那个字符;
2. 定义常量指针 label,指向字符数组 "|/-\\",存储了要输出的四个字符;
3. 使用一个 while 循环,不断执行以下操作:
4. 使用取模运算符将 index 的值限制在 0~3 之间,确保 index 不会越界;
5. 使用 printf 函数输出格式化字符串 "[%c]\r",其中 %c 表示要输出的字符,\r 表示将输出的光标移回行首,以便下一次输出覆盖当前输出;
6. 将 index 值加 1,以便下一次循环时输出下一个字符;
7. 使用 Sleep 函数暂停一段时间,以便动画效果更显著;
8. 循环回到第 4 步,继续输出动画。

倒计时

#include<stdio.h>
#include<windows.h>
int main()
{
	int i = 9;
	for (i = 9; i >= 0; i--)
	{
		printf("[%d]\r", i);
		Sleep(1000);
	}
	return 0;
}

        这段代码是一个简单的倒计时程序,通过循环输出数字并使用 Sleep 函数暂停一段时间,实现倒计时效果。具体来说:

1. 在 main 函数中定义变量 i 并初始化为 9,用于表示当前的倒计时值;
2. 使用 for 循环从 9 开始倒数,一直到 0;
3. 在循环体中,使用 printf 函数输出格式化字符串 "[%d]\r",其中 %d 表示要输出的数字,\r 表示将输出的光标移回行首,以便下一次输出覆盖当前输出;
4. 使用 Sleep 函数暂停一秒钟,以便倒计时效果更显著;
5. 循环回到第 3 步,输出下一个数字,直到倒计时结束;
6. for 循环结束后,程序返回 0,表示正常结束。

单引号和双引号

        在 C 语言中,单引号和双引号都是用于表示字面量的符号。

1. 单引号:单引号括起来的字符表示字符字面量,比如 'a', 'b', '1' 等。在程序中使用时,单引号里的字符会被编译器转换成该字符的 ASCII 码或 Unicode 码,如 'a' 对应的 ASCII 码是 97,可以用整型变量存储。

示例:char c = 'a';

2. 双引号:双引号括起来的内容表示字符串字面量,比如 "hello","world" 等。在程序中使用时,双引号里的字符串会被编译器转换成一个字符数组,以空字符 '\0' 结尾。

示例:char s[] = "hello world";

        需要注意的是,单引号和双引号在 C 语言中是有区别的,不能混淆。在 C 语言中,两者不能互换使用。

//单引号是字符,双引号是字符串
#include <stdio.h>
//不同编译器,会有细微的差别
int main()
{
	printf("%d\n", sizeof(1));
	printf("%d\n", sizeof("1"));
	//C99标准的规定,'a'叫做整型字符常量(integer character constant),被看成是int型
	printf("%d\n", sizeof('1'));
	char c = '1';
	printf("%d\n", sizeof(c));
	return 0;
}

        这段代码主要演示了 C 语言中单引号和双引号的一些不同用法和特性。具体来说:

1. printf("%d\n", sizeof(1));:sizeof 运算符可以用于计算表达式或数据类型的大小,这里使用 sizeof(1) 计算整型常量 1 的大小,得到结果为 4,因为在大多数 C 语言实现中,整型常量都被视为 int 类型,占用 4 个字节。

2. printf("%d\n", sizeof("1"));:使用 sizeof("1") 计算字符串字面量 "1" 的大小,结果为 2,因为字符串字面量中除了字符本身还会包含一个结尾的空字符 '\0',所以实际大小为 2 个字节。

3. printf("%d\n", sizeof('1'));:使用 sizeof('1') 计算字符字面量 '1' 的大小,结果为 4,因为字符字面量 '1' 被视为整型字符常量,类型为 int,占用 4 个字节。

4. char c = '1'; printf("%d\n", sizeof(c));:定义一个 char 类型的变量 c,初始化为字符字面量 '1',使用 sizeof(c) 计算变量 c 的大小,结果为 1,因为 char 类型占用 1 个字节。这里的字符字面量 '1' 被视为整型字符常量,只不过把整型4个字节数据写到1个字节里,这里一直在发生截断。

        需要注意的是,在不同的编译器和不同的标准下,对于整型字符常量和字符字面量的处理方式可能存在差异,建议按照标准的规定使用。下图分别是是gcc和vs编译环境下的结果。

learn_C_deep_10 深刻认识C语言重点操作符

'abcd'这样写有问题吗?

#include<stdio.h>
#include<windows.h>
int main()
{
	"";
	'';//error C2137: 空字符常量
	"a";
	'a';
	"abcd";
	'abcd';//?
	char c = 'abcd';//warning C4305: “初始化”: 从“int”到“char”截断
	printf("%c\n", c);//  d
	c = 'abcdef';// error C2015: 常量中的字符太多
	c = 'abc';
	printf("%c\n", c);//   c
	return 0;
}

learn_C_deep_10 深刻认识C语言重点操作符

        这段代码主要演示了 C 语言中字符串和字符字面量的使用和一些细节问题。具体来说:

1. "" 和 "a":这是两个字符串字面量,分别表示空字符串和包含一个字符 'a' 的字符串。在编译时,C 语言编译器会将字符串字面量转换为字符数组,因此在程序中可以像使用字符数组一样使用字符串字面量。

2. '' 和 'a':这是两个字符字面量,分别表示字符 'a' 和空字符,即不含任何字符的字符字面量。需要注意的是,在 C 语言中,字符字面量必须包含一个字符,因此使用单引号括起来的空字符是错误的语法。

3. "abcd" 和 'abcd':这是正确的语法,字符串字面量 "abcd" 包含 5 个字符(包括结尾的空字符),而字符字面量 'abcd' 被定义为 int,4个字节可以存放数据。

4. char c = 'abcd';:这是合法的语法,但是编译器会发出警告(warning),提示将 int 类型的整数截断为 char 类型。实际上,在 C 语言中,字符常量的类型被定义为 int,因此使用 char 类型的变量存储字符常量时,会发生类型截断。

5. c = 'abcdef';:这是错误的语法,因为字符字面量 'abcdef' 包含了多个字符,已经超过了int类型的字节数。。

6. c = 'abc';:这是合法的语法,但是编译器会发出警告(warning),提示将 int 类型的整数截断为 char 类型。实际上,在 C 语言中,字符常量的类型被定义为 int,因此使用 char 类型的变量存储字符常量时,会发生类型截断。

        需要注意的是,使用字符串和字符时,需要注意其长度和类型,避免出现类型不匹配或越界访问等问题。

特殊情况

learn_C_deep_10 深刻认识C语言重点操作符

为何计算机需要字符

        计算机需要字符是因为字符是人类交流和存储信息的基本单位之一。在计算机的发展历史中,最初的计算机只能处理数值数据,无法处理字符和文本信息,这限制了计算机在人机交互和信息处理方面的应用。

        在计算机中,所有的数据都是以二进制的形式存储和处理的,即由0和1两种状态来表示信息。但计算机所表示的信息类型很多,比如文字、图像、声音等,如果直接使用0和1来表示这些信息显然是不太现实的,因此我们需要一种将这些信息转化为二进制的方法,并且能够让计算机正确地将其解码回来的方法。

        这时就出现了字符编码,它是一种将文字、数字、符号等字符转化为计算机可识别的二进制数的方法。常用的字符编码有ASCII码和Unicode码,它们可以将每一个字符都映射到一个独一无二的二进制数上。

        例如,在ASCII码中,每个字符都被映射到一个包含7个二进制位的数字上,可以表示128种不同的字符,包括英文字母、数字和标点符号等。而在Unicode码中,每个字符则被映射到一个包含16个二进制位的数字上,可以表示超过13万种不同的字符,包括各种语言的文字、符号和表情等。

        通过使用字符编码,计算机可以正确地将输入的文字、图像、声音等信息转化为二进制,并在需要的时候将其解码回来,实现信息的存储、处理和显示等功能。

learn_C_deep_10 深刻认识C语言重点操作符

逻辑运算符

        C语言中的逻辑运算符有两种,分别为逻辑与(&&)和逻辑或(||)。它们的作用如下:

1.逻辑与(&&):如果两个操作数都为真,则表达式的值为真;否则,表达式的值为假。

2.逻辑或(||):如果两个操作数中至少有一个为真,则表达式的值为真;否则,表达式的值为假。

//级联两个(多个)逻辑表达式,必须同时为真,结果才为真
//与&(按位与)是不同的概念
#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	//前置++ i先自增,再使用
	if ((++i < 0) && (++j > 0)) {
		printf("enter if!\n");
	}
	printf("%d, %d\n", i, j); //1, 1
	return 0;
}
//级联两个(多个)逻辑表达式,必须至少一个为真,结果才为真
//与|(按位或)是不同的概念
#include <stdio.h>
#include <windows.h>
int main()
{
	int i = 0;
	int j = 0;
    //发生短路:一个条件为真,已经不需要在看后续的条件的情况
	if ((++i > 0) || (++j > 0)) { //注意更改条件
		printf("enter if!\n");
	}
	printf("%d, %d\n", i, j); // 1, 0
	system("pause");
	return 0;
}

短路

        逻辑运算符有一个特点,即只要能够确定整个表达式的值,就会立即停止计算。这个特点称为“短路”,执行顺序是从左到右的。主要体现在以下两种情况:

1. 对于逻辑与(&&)来说,如果第一个操作数为假,则整个表达式的值一定为假,所以不会再去计算第二个操作数,直接返回假。

2. 对于逻辑或(||)来说,如果第一个操作数为真,则整个表达式的值一定为真,所以不会再去计算第二个操作数,直接返回真。

#include <stdio.h>
int show()
{
	printf("you can see me!\n");
	return 1;
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	a == 10 && show();
	return 0;
}

        这段代码的功能是判断用户输入的数是否等于10,如果等于,则调用函数show()。如果不等于,则不会调用该函数。

具体分析如下:

1. 定义了一个函数show(),其功能是输出一段文字并返回1。

2. 在主函数中,定义了一个整型变量a,从用户输入中获取值。

3. 判断a是否等于10,并用逻辑与运算符连接show()函数的调用。由于逻辑与(&&)具有短路特性,所以只有在a等于10时,才会调用show()函数。

4. 最后返回0,表示程序运行正常结束。

#include <stdio.h>
int show()
{
	printf("you can see me!\n");
	return 1;
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	a == 10 || show();
	return 0;
}

这段代码的功能是判断用户输入的数是否等于10,如果不等于10,则调用函数show()。如果等于10,则不会调用该函数。

具体分析如下:

1. 定义了一个函数show(),其功能是输出一段文字并返回1。

2. 在主函数中,定义了一个整型变量a,从用户输入中获取值。

3. 判断a是否等于10,并用逻辑或运算符连接show()函数的调用。由于逻辑或(||)具有短路特性,当a不等于10时,才会调用show()函数。

4. 最后返回0,表示程序运行正常结束。

位运算符

C语言中的位运算符可以直接操作二进制数的每一位,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)。

1. 按位与(&):两个相应的二进制位都为1时,结果为1;否则,结果为0。

2. 按位或(|):两个相应的二进制位都为0时,结果为0;否则,结果为1。

3. 按位异或(^):两个相应的二进制位不同时,结果为1;否则,结果为0。

4. 按位取反(~):对操作数的每一位取反,即0变成1,1变成0。

#include <stdio.h>
int main()
{
	/*
		2的补码:0000 0000 0000 0000 0000 0000 0000 0010
		3的补码:0000 0000 0000 0000 0000 0000 0000 0011
	*/
	//|:两个相应的二进制位都为0时,结果为0;否则,结果为1。
	//  0000 0000 0000 0000 0000 0000 0000 0011 - 3
	printf("%d\n", 2 | 3); 

	//&:两个相应的二进制位都为1时,结果为1;否则,结果为0。
	//  0000 0000 0000 0000 0000 0000 0000 0010 - 2
	printf("%d\n", 2 & 3); 

	//^:两个相应的二进制位不同时,结果为1;否则,结果为0。
	//  0000 0000 0000 0000 0000 0000 0000 0001 - 1
	printf("%d\n", 2 ^ 3); 

	//~:对操作数的每一位(包括符号位)取反,即0变成1,1变成0。
	//  1111 1111 1111 1111 1111 1111 1111 1111 - 补码
	//  1111 1111 1111 1111 1111 1111 1111 1110 - 反码
	//  1000 0000 0000 0000 0000 0000 0000 0001 - 原码  - -1
	printf("%d\n", ~0); 
	return 0;
}

&& vs &、|| vs |的区别

&& vs &

&&:级联的是多个逻辑表达式,需要的是真假结果

& :级联的是多个数据,逐比特位进行位运算

逻辑结果:吃了吗?

数据结果:吃了多少?

|| vs | 同上

关于^的理解

        在C语言中,符号“^”是按位异或运算符。它是一个二元运算符,将两个操作数的二进制表示逐位比较,如果相应的位上一个操作数为1,另一个为0,则结果为1,否则结果为0。

// ^ : 逐比特位,相同为0,相异为1
//任何数和0异或,都是它本身
#include <stdio.h>
int main()
{
	/*
		 3的补码:0000 0000 0000 0000 0000 0000 0000 0011
		 0的补码:0000 0000 0000 0000 0000 0000 0000 0000
		-3的补码:1111 1111 1111 1111 1111 1111 1111 1101
	*/

	//任何数和0异或,都是它本身
	
	//0000 0000 0000 0000 0000 0000 0000 0011
	//0000 0000 0000 0000 0000 0000 0000 0000
	//0000 0000 0000 0000 0000 0000 0000 0011 - 3
	printf("%d\n", 3 ^ 0);
	//0000 0000 0000 0000 0000 0000 0000 0000
	//0000 0000 0000 0000 0000 0000 0000 0000
	//0000 0000 0000 0000 0000 0000 0000 0000 - 0
	printf("%d\n", 0 ^ 0);
	//1111 1111 1111 1111 1111 1111 1111 1101
	//0000 0000 0000 0000 0000 0000 0000 0000
	//1111 1111 1111 1111 1111 1111 1111 1101 - -3
	printf("%d\n", -3 ^ 0);
	return 0;
}

总结:任何数和0异或,都是它本身。

#include<stdio.h>
// ^ : 支持结合律和交换律
//任何一个数和自身异或的结果都是0
int main()
{
	/*
		3的补码:0000 0000 0000 0000 0000 0000 0000 0011
		1的补码:0000 0000 0000 0000 0000 0000 0000 0001
	*/
	/*
		0000 0000 0000 0000 0000 0000 0000 0011
		0000 0000 0000 0000 0000 0000 0000 0001
		0000 0000 0000 0000 0000 0000 0000 0010 - 3 ^ 1的结果
		0000 0000 0000 0000 0000 0000 0000 0011 
		0000 0000 0000 0000 0000 0000 0000 0001 - 3 ^ 1 ^ 3的结果 - 1
	*/
	printf("%d\n", 3 ^ 1 ^ 3);
	/*
		0000 0000 0000 0000 0000 0000 0000 0011
		0000 0000 0000 0000 0000 0000 0000 0011
		0000 0000 0000 0000 0000 0000 0000 0000 - 3 ^ 3的结果
		0000 0000 0000 0000 0000 0000 0000 0001
		0000 0000 0000 0000 0000 0000 0000 0001 - 3 ^ 3 ^ 1的结果 - 1
	*/
	printf("%d\n", 3 ^ 3 ^ 1);
	/*
		0000 0000 0000 0000 0000 0000 0000 0011
		0000 0000 0000 0000 0000 0000 0000 0001
		0000 0000 0000 0000 0000 0000 0000 0010 - (3 ^ 1)的结果
		0000 0000 0000 0000 0000 0000 0000 0011
		0000 0000 0000 0000 0000 0000 0000 0001 - 3 ^ (3 ^ 1)的结果 - 1
	*/
	printf("%d\n", 3 ^ (3 ^ 1));
	return 0;
}

1、^ : 支持结合律和交换律。

2、任何一个数和自身异或的结果都是0。

通过异或交换两个整数

常规写法

//容易出现溢出问题
#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	a = a + b;
	b = a - b;
	a = a - b;
	return 0;
}

learn_C_deep_10 深刻认识C语言重点操作符

为什么会有溢出的问题呢?

        在C语言中,当执行二进制位运算时,如果结果超过了变量的可表示范围,就会发生溢出。

        假设我们有一个32位有符号整数,其最大值为2,147,483,647,最小为-2,147,483,648。现在假设我们要对其执行以下操作:

```
int a = 2147483647;
int b = a + 1;
```

由于a已经达到了整数的最大值,因此b的值将溢出。在这种情况下,b将是-2,147,483,648,这是整数的最小值。

        这是因为有符号整数的最高位(即最左侧位)表示符号,0表示正数,1表示负数。因此,当最高位是1时,整数的值将为负数,且符号位不参与位运算。在这种情况下,当b的值达到2,147,483,648时,它的最高位将变为1,导致整数的值为负数。由于它的符号位不参与运算,因此结果是 -2147483648。

        因此,在进行运算时,你需要确保结果不会超出变量所能表示的范围,否则会导致意外的结果。可以使用一些技巧,如类型转换或适当的移位来避免这种情况。

异或写法

#include<stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	return 0;
}

learn_C_deep_10 深刻认识C语言重点操作符

 

设置指定的比特位为1

#include<stdio.h>
//任何数或0保持不变
//任何数或1结果为1
#define SETBIT(x,n) x|=(1<<(n-1))
void ShowBits(int x)
{
	//按位与获取每一位值
	int num = sizeof(x) * 8 - 1;
	while (num >= 0)
	{
		if (x & (1 << num))
		{
			printf("1 ");
		}
		else
		{
			printf("0 ");
		}
		num--;
	}
	printf("\n");
}
int main()
{
	int x = 0;
	//设置指定的比特位为1
	SETBIT(x, 5);
	//0000 0000 0000 0000 0000 0000 0001 0000 
	//显示所有的比特位
	ShowBits(x);
	return 0;
}

设置指定的比特位为0文章来源地址https://www.toymoban.com/news/detail-447613.html

#include<stdio.h>
//任何数与0结果为0    0 & 0,0 & 1 - 0 - 0
//任何数与1保持不变   0 & 1,1 & 1 - 0 - 1
#define SETBIT(x,n) x&=(~(1<<(n-1)))
void ShowBits(int x)
{
	//按位与获取每一位值
	int num = sizeof(x) * 8 - 1;
	while (num >= 0)
	{
		if (x & (1 << num))
		{
			printf("1 ");
		}
		else
		{
			printf("0 ");
		}
		num--;
	}
	printf("\n");
}
int main()
{
	int x = 2;
	//设置指定的比特位为1
	SETBIT(x, 2);
	//0000 0000 0000 0000 0000 0000 0000 0010
	//&
	//1111 1111 1111 1111 1111 1111 1111 1101 取反
	//0000 0000 0000 0000 0000 0000 0000 0000 
	//显示所有的比特位
	ShowBits(x);
	return 0;
}

到了这里,关于learn_C_deep_10 深刻认识C语言重点操作符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自然语言处理(六): Deep Learning for NLP: Feedforward Networks

    目录 1. Deep Learning 1.2 Feed-forward NN 1.3 Neuron 1.4 Matrix Vector Notation 矩阵向量表示法 1.5 Output Layer 1.6 Learning from Data 1.7 Regularisation 正则化 1.8 Dropout 2. Applications in NLP 2.1 Topic Classification 2.2 Topic Classification - Training 2.3 Topic Classification - Prediction 2.4 Topic Classification - Improvements 2.5

    2023年04月09日
    浏览(30)
  • deep learning 代码笔记

    len (X)总是返回第0轴的长度。 What are the shapes of summation outputs along axis 0, 1, and 2? f ( x ) = ||  x||   2 的梯度 自动微分法计算: 因此,梯度是x的单位向量。在x = 0处的梯度在数学上是未定义的,但是自动微分返回零。要小心,在这种情况下可能会出现差异。 默认情况下,最后一

    2024年02月21日
    浏览(32)
  • MATLAB Deep learning

    深度学习是一种机器学习,而机器学习是一种人工智能。 机器学习的本质 :机器学习是一种从“数据”中找到“模型”的技术。在这里,数据的字面意思是指文档、音频、图像等信息。这个“模型”是机器学习的最终产物。 机器学习的创建是为了 解决分析模型几乎不可用的

    2024年01月17日
    浏览(78)
  • Deep Learning-学习笔记

    deep learning训练过程 如果对所有层同时训练,时间复杂度会太高;如果每次训练一层,偏差就会逐层传递。这会面临跟上面监督学习中相反的问题,会严重欠拟合(因为深度网络的神经元和参数太多了)。 2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,

    2024年02月12日
    浏览(28)
  • The Deep Learning AI for Environmental Monitoring——Deep

    作者:禅与计算机程序设计艺术 环境监测是整个经济社会发展的一个重要环节,环境数据是影响经济、金融、社会和政策走向的不可或缺的组成部分。目前,环境监测主要依靠地面站(例如气象台)或者卫星遥感影像获取的数据进行实时监测,其精确度受到数据源和采集技术

    2024年02月08日
    浏览(35)
  • 《Dive into Deep Learning》

    《Dive into Deep Learning》:https://d2l.ai/ Interactive deep learning book with code, math, and discussions Implemented with PyTorch, NumPy/MXNet, JAX, and TensorFlow Adopted at 500 universities from 70 countries 《动手学深度学习》中文版:https://zh.d2l.ai/chapter_preface/index.html 课程安排: https://courses.d2l.ai/zh-v2/

    2024年02月11日
    浏览(37)
  • Tips for Deep Learning

    目录 Recipe of Deep Learning  Good Results on Training Data? New activation function Adaptive learning rate Good Results on Testing Data? Early Stopping Regularization Dropout 我们要做的第一件事是,提高model在training set上的正确率,然后要做的事是,提高model在testing set上的正确率。 这一部分主要讲述如何在

    2024年02月05日
    浏览(34)
  • 《Learning to Reweight Examples for Robust Deep Learning》笔记

    [1] 用 meta-learning 学样本权重,可用于 class imbalance、noisy label 场景。之前对其 (7) 式中 ϵ i , t = 0 epsilon_{i,t}=0 ϵ i , t ​ = 0 ( 对应 Algorithm 1 第 5 句、代码 ex_wts_a = tf.zeros([bsize_a], dtype=tf.float32) )不理解:如果 ϵ epsilon ϵ 已知是 0,那 (4) 式的加权 loss 不是恒为零吗?(5) 式不是

    2024年01月23日
    浏览(80)
  • AIGC实战——深度学习 (Deep Learning, DL)

    深度学习 ( Deep Learning , DL ) 是贯穿所有生成模型 ( Generative Model ) 的共同特征,几乎所有复杂的生成模型都以深度神经网络为核心,深度神经网络能够学习数据结构中的复杂关系,而不需要预先提取数据特征。在本节中,我们将介绍深度学习基本概念,并利用 Keras 构建深度神

    2024年02月08日
    浏览(31)
  • 可信深度学习Trustworthy Deep Learning相关论文

    Survey An Overview of Catastrophic AI Risks. [paper] Connecting the Dots in Trustworthy Artificial Intelligence: From AI Principles, Ethics, and Key Requirements to Responsible AI Systems and Regulation. [paper] A Survey of Trustworthy Federated Learning with Perspectives on Security, Robustness, and Privacy. [paper] Adversarial Machine Learning: A Systemati

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包