C语言基础(day0424)
目录
一. 键盘输入
1.1 grtchar()
1.2 scanf()
总结:
二. 全局变量/局部变量(函数的分类)
1.全局变量
2.局部变量
三.C语言内存模型(堆栈内存and so on )
3.1 栈区(stack)(未完待续.....)
3.2 堆区
3.3 全局静态区
1. 未初始化
2. 已初始化
3.4 常量区
3.5 代码区
四.基本数据类型的转换
4.1 自动转换
4.2 强制转换
4.3 数据类型的精度
五. 运算符
1. 算数运算符
2. 比较运算符
3. 赋值运算符
4. 自增运算符
5. 逻辑运算符
6. 条件运算符(三目运算符)
7. 逗号运算符
8. 运算符优先级(未完待续.....)
9. 位运算符
1. 补码的核心定义
2. 按位取反 (~) 的本质
3. 按位取反步骤(公式为~ a = -(a + 1))
一. 键盘输入
1.1 grtchar()
getchar() 函数用于从标准输入中读取一个字符,返回值为读取的字符。
getchar() 函数会等待用户输入一个字符并按下回车键,然后返回该字符的 ASCII 值。
// 这是一个简单的 getchar()示例,getchar只能读取数据类型为字符的变量// getchar() 函数用于从标准输入中读取一个字符,返回值为读取的字符。// getchar() 函数会等待用户输入一个字符并按下回车键,然后返回该字符的 ASCII 值。printf("请输入一个字符:\n");printf("请输入一个字符:\n");char ch = getchar(); // 使用 getchar 获取一个字符输入,并将其存储到变量 ch 中printf("您输入的字符是:%c\n", ch); // 输出用户输入的字符
1.2 scanf()
1. 使用 scanf 函数从标准输入中读取数据需要包含 stdio.h 头文件
2. scanf() 函数用于从标准输入中读取数据,格式为 scanf("格式控制字符串", 参数列表),类似于 printf() 的格式化输出。3. 谨防 “空格陷阱” 。
#include <stdio.h>
int main(int argc, char const *argv[])
{// 这是一个简单的 printf() 示例printf("请输入一个字符:\n");printf("请输入一个字符:\n");char ch = getchar(); // 使用 getchar 获取一个字符输入,并将其存储到变量 ch 中printf("您输入的字符是:%c\n", ch); // 输出用户输入的字符// 使用 scanf 函数从标准输入中读取数据需要包含 stdio.h 头文件// scanf() 函数用于从标准输入中读取数据,格式为 scanf("格式控制字符串", 参数列表),类似于 printf() 的格式化输出。// 常见的格式化输入符号包括:%d(整数),%f(浮点数),%c(字符),%s(字符串),%x(十六进制整数),%o(八进制整数),%p(指针地址)。printf("请输入一个整数:\n");int num = 0; // 定义一个整数变量 num 并初始化为 0// 使用 scanf() 函数从标准输入中读取整数并存储到 num 中scanf("%d", &num); // 使用 scanf 函数从标准输入中读取一个整数并存储到 num 中printf("您输入的整数是:%d\n", num); // 输出用户输入的整数printf("请输入一个字符类型变量:\n");char c1; // 定义一个字符变量 c1scanf("%c", &c1); // 使用 scanf 函数从标准输入中读取一个字符并存储到 c1 中printf("您输入的字符是:%c\n", c1); // 输出用户输入的字符// 使用 scanf() 函数从标准输入中读取多个变量的值printf("请输入两个变量的值(一个整数和一个浮点数):\n");int a = 0; // 定义一个整数变量 a 并初始化为 0float b = 0.0; // 定义一个浮点数变量 b 并初始化为 0.0scanf("%d %f", &a, &b); // 使用 scanf 函数从标准输入中读取一个整数和一个浮点数,并存储到变量 a 和 b 中printf("您输入的整数是:%d,浮点数是:%f\n", a, b); // 输出用户输入的整数和浮点数return 0;
}
总结:
空格在
scanf
中的行为:匹配输入中的任意数量空白字符(包括零个或多个)。格式字符串中的普通字符:必须严格匹配输入流中的字符。
最佳实践:
谨慎使用格式字符串中的空格。
结合
fgets
和sscanf
处理输入,避免缓冲区残留问题。始终检查
scanf
的返回值,确保输入符合预期。
二. 全局变量/局部变量(函数的分类)
1.全局变量
(1)即作用于代码运行全过程的变量
(2)具体演示,在下方代码
#include <stdio.h>// 全局变量..........所有函数都可以访问
// 全局变量如果未赋值,分配的默认值根据数据类型的不同而不同
// 全局变量耦合度高,容易引起错误,使用时要小心
/*int类型的全局变量默认值为0float类型的全局变量默认值为0.000000char类型的全局变量默认值为'\0'double类型的全局变量默认值为0.000char类型的全局变量默认值为'\0'short类型的全局变量默认值为0long类型的全局变量默认值为0*/
int globalVar = 10; // 全局变量,作用域为整个文件,与函数平级void function()
{// 局部变量int localVar = 5; // 局部变量,作用域仅限于此函数内printf(" 函数内 局部变量 localVar 的值: %d\n", localVar);printf(" 函数内 全局变量 globalVar 的值: %d\n", globalVar);
}int main()
{printf("全局变量 globalVar 的值: %d\n", globalVar); // 可以访问全局变量function(); // 调用上方的函数// printf("局部变量 localVar 的值: %d\n", localVar); // 这行代码会报错,因为 localVar 作用域仅限于 function 函数return 0;
}
2.局部变量
(1)即作用于部分代码块的变量
(2)具体演示,在下方代码
#include <stdio.h>// 局部变量示例:演示局部变量的初始化和使用
// 局部变量未初始化时,其默认值是未定义的,因为普通局部变量存储在栈空间中,包含之前的随机数据。
int main()
{// 未初始化的局部变量-----------注意其默认值是未定义的int localVar; // 局部变量声明但未初始化printf("未初始化的局部变量 localVar 的值: %d\n", localVar);// 初始化局部变量-----------默认值为0localVar = 0;localVar = 0; // 初始化局部变量,将其值设置为0printf("初始化后的局部变量 localVar 的值: %d\n", localVar);// 在同一个函数中,局部变量可以重复使用// int localVar = 5; // 如果这样写会报错,因为 localVar 已经在上面声明过,并且已经使用 int 在栈中分配了空间// printf("在同一个函数中,局部变量可以重复使用,但需要注意不能重新声明同名变量。");// 在同一个函数中,可以使用同名的变量,但需要使用不同的作用域localVar = 5; // 修改局部变量的值为5printf("修改后的局部变量 localVar 的值: %d\n", localVar);return 0;
}
三.C语言内存模型(堆栈内存and so on )
内存分为五个模块,我们常用的int在内存开辟空间,其实就是,在内存呢的栈区开辟了空间byte为4.
3.1 栈区(stack)(未完待续.....)
1. 先进后出(filo模式),即电梯,弹夹
2. 表现形式为倒扣水杯,口朝下(上方闭口为栈底,开口处为栈顶,先进为高地址,反之为底)
3. 未初始化的变量,会覆盖掉之前的栈帧(那么意思就是栈帧是不会立刻消失,在内存中仍有痕迹)
3.2 堆区
3.3 全局静态区
未完待续......
1. 未初始化
未完待续......
2. 已初始化
未完待续......
3.4 常量区
未完待续......
3.5 代码区
未完待续......
四.基本数据类型的转换
1. 自动类型转换:当同意表达式中有不同类型的变量时,编译器会自动将低精度类型转换为高精度类型,然后进行运算。
2. 强制类型转换:使用强制类型转换运算符将一种数据类型转换为另一种数据类型。
3. 数据类型的转换不会影响数据本身的值,只是改变了数据在内存中的存储方式。
4.1 自动转换
int a = 5;float b = 2.5;double c = 3.5;// 自动类型转换double result = a + b + c; // int -> float -> double,printf("自动类型转换结果: %f\n", result); // 输出结果为 11.000000,%f表示浮点数格式输出,默认保留6位小数
4.2 强制转换
/*强制类型转换int -> float -> double*/int d = 5;float e = 2.5;double f = 3.5;// 强制类型转换double result2 = (double)d + (double)e + (double)f; // int -> float -> doubleprintf("强制类型转换结果: %f\n", result2); // 输出结果为 11.000000,%f表示浮点数格式输出,默认保留6位小数// 再转为int类型int result3 = (int)result2; // double -> intprintf("强制类型转换结果: %d\n", result3); // 输出结果为 11
4.3 数据类型的精度
高精度类型:double、float、long double
低精度类型:int、char、short、long
高转低精度类型:基本不会失去精度,数据不会丢失。
低转高精度类型:会失去精度,可能会导致数据丢失。
五. 运算符
去
1. 算数运算符
用于基本数学运算。
运算符 描述 示例 注意 +
加法 a + b
-
减法 a - b
*
乘法 a * b
/
除法 a / b
整数除法会丢弃小数部分 %
取模(余数) a % b
只能用于整数,结果符号与被除数相同 ++
自增 a++
或++a
a = ( a + 1 ) --
自减 a--
或--a
同上
#include <stdio.h>// 实型是指小数的类型,整型是指整数的类型,字符型是指字符的类型
float f = 10.0; // 浮点型变量,表示小数类型
// 整形是指整数的类型,实型是指小数的类型,字符型是指字符的类型
int i = 10; // 整型变量,表示整数类型int main(int argc, char const *argv[])
{// 算数运算符// 正数负数int a = 10;int b = -10;printf("a = %d, b = %d\n", a, b);// 基本算数运算符int c = 20;int d = 10;float f1 = 5.5;float f2 = 10.5;printf("c + d = %d\n", c + d); // 加法printf("c - d = %d\n", c - d); // 减法printf("c * d = %d\n", c * d); // 乘法printf("c / d = %d\n", c / d); // 除法,除数不能为0printf("c %% d = %d\n", c % d); // 取余,此处需要用%%来转义%,因为%是格式化输出的标志,取小数点后1位的值,不能对0取余,除数不能为0// 1. 先乘除后加减printf("c + d * 2 = %d\n", c + d * 2);// 2. 先乘除后加减,括号内的优先级最高printf("c + d * 2 = %d\n", (c + d) * 2); // 先加减后乘除,括号内的优先级最高// 3. 两个整数相除,结果是整数,取整printf("c / d = %d\n", c / d); // 结果是整数,取整// 4. 两个浮点数相除,结果是浮点数,保留小数点后6位printf("f1 / f2 = %f\n", f1 / f2); // 结果是浮点数,保留小数点后6位// 5. 整数和浮点数相除,结果是浮点数,保留小数点后6位printf("c / f1 = %f\n", c / f1); // 结果是浮点数,保留小数点后6位// 6. 取余运算符%只能用于整数之间的运算,不能用于浮点数之间的运算// printf("f1 %% f2 = %f\n", f1 % f2); // 错误,取余运算符%只能用于整数之间的运算,不能用于浮点数之间的运算// 7. 对负数取余,正整数的余数是正数,负整数的余数是负整数printf("b %% d = %d\n", b % d); // 结果是负整数,取余运算符%只能用于整数之间的运算,不能用于浮点数之间的运算return 0;
}
2. 比较运算符
比较运算符:==、!=、>、<、>=、<=
==:相等运算符,判断两个值是否相等(与赋值运算符=不同)
!=:不相等运算符,判断两个值是否不相等
>: 大于运算符,判断左边的值是否大于右边的值
<: 小于运算符,判断左边的值是否小于右边的值
>=:大于等于运算符,判断左边的值是否大于或等于右边的值
<=:小于等于运算符,判断左边的值是否小于或等于右边的值
注意:比较运算符的结果是布尔值(0或1),0表示假,1表示真。
用于比较两个值,返回
1
(真)或0
(假)。
运算符 描述 示例 注意 ==
等于 a == b
不要与 =
混淆!=
不等于 a != b
>
大于 a > b
<
小于 a < b
>=
大于等于 a >= b
<=
小于等于 a <= b
#include <stdio.h>
int main(int argc, char const *argv[])
{/*比较运算符:==、!=、>、<、>=、<===:相等运算符,判断两个值是否相等(与赋值运算符=不同)!=:不相等运算符,判断两个值是否不相等>: 大于运算符,判断左边的值是否大于右边的值<: 小于运算符,判断左边的值是否小于右边的值>=:大于等于运算符,判断左边的值是否大于或等于右边的值<=:小于等于运算符,判断左边的值是否小于或等于右边的值注意:比较运算符的结果是布尔值(0或1),0表示假,1表示真。*/int a = 10, b = 20;printf("a == b: %d\n", a == b); // 相等(==)运算符 返回值0,表示假printf("a != b: %d\n", a != b); // 不相等(!=)运算符 返回值1,表示真printf("a > b: %d\n", a > b); // 大于(>)运算符 返回值0,表示假printf("a < b: %d\n", a < b); // 小于(<)运算符 返回值1,表示真printf("a >= b: %d\n", a >= b); // 大于等于(>=)运算符 返回值0,表示假printf("a <= b: %d\n", a <= b); // 小于等于(<=)运算符 返回值1,表示真./*比较运算符自身的优先级低于算术运算符和位运算符,但高于逻辑运算符。例如:在表达式 a + b > c && d < e 中,首先计算 a + b 和 d < e,然后再进行逻辑与运算。*/int c = 30, d = 40, e = 50;printf("a + b > c && d < e: %d\n", (a + b > c) && (d < e)); // 返回值1,表示真/*算数运算符的优先级高于比较运算符,但低于逻辑运算符。例如:在表达式 a + b > c && d < e 中,首先计算 a + b 和 d < e,然后再进行逻辑与运算。*/printf("a + b > c && d < e: %d\n", (a + b > c) && (d < e)); // 返回值1,表示真return 0;
}
3. 赋值运算符
赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
=: 赋值运算符,将右边的值赋给左边的变量
+=: 加法赋值运算符,将右边的值加到左边的变量上,并将结果赋给左边的变量
-=: 减法赋值运算符,将右边的值减去左边的变量,并将结果赋给左边的变量
*=: 乘法赋值运算符,将右边的值乘以左边的变量,并将结果赋给左边的变量
/=: 除法赋值运算符,将左边的变量除以右边的值,并将结果赋给左边的变量
%=: 取余赋值运算符,将左边的变量除以右边的值,并将余数赋给左边的变量
&=: 按位与赋值运算符,将左边的变量和右边的值进行按位与运算,并将结果赋给左边的变量
|=: 按位或赋值运算符,将左边的变量和右边的值进行按位或运算,并将结果赋给左边的变量
^=: 按位异或赋值运算符,将左边的变量和右边的值进行按位异或运算,并将结果赋给左边的变量
<<=:左移赋值运算符,将左边的变量左移右边的位数,并将结果赋给左边的变量
>>=:右移赋值运算符,将左边的变量右移右边的位数,并将结果赋给左边的变量
注意:赋值运算符,会修改变量的原始值用于给变量赋值。
运算符 描述 示例 等价于 =
简单赋值 a = 5
+=
加后赋值 a += 3
a = a + 3
-=
减后赋值 a -= 2
a = a - 2
*=
乘后赋值 a *= 4
a = a * 4
/=
除后赋值 a /= 2
a = a / 2
%=
取模后赋值 a %= 3
a = a % 3
#include <stdio.h>
int main(int argc, char const *argv[])
{/*赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>==: 赋值运算符,将右边的值赋给左边的变量+=: 加法赋值运算符,将右边的值加到左边的变量上,并将结果赋给左边的变量-=: 减法赋值运算符,将右边的值减去左边的变量,并将结果赋给左边的变量*=: 乘法赋值运算符,将右边的值乘以左边的变量,并将结果赋给左边的变量/=: 除法赋值运算符,将左边的变量除以右边的值,并将结果赋给左边的变量%=: 取余赋值运算符,将左边的变量除以右边的值,并将余数赋给左边的变量&=: 按位与赋值运算符,将左边的变量和右边的值进行按位与运算,并将结果赋给左边的变量|=: 按位或赋值运算符,将左边的变量和右边的值进行按位或运算,并将结果赋给左边的变量^=: 按位异或赋值运算符,将左边的变量和右边的值进行按位异或运算,并将结果赋给左边的变量<<=:左移赋值运算符,将左边的变量左移右边的位数,并将结果赋给左边的变量>>=:右移赋值运算符,将左边的变量右移右边的位数,并将结果赋给左边的变量注意:赋值运算符,会修改变量的原始值*/// 赋值运算符,将右边的值赋给左边的变量// 复合赋值运算符,将右边的值加到左边的变量上,并将结果赋给左边的变量double a = 888888.88;a += 11.11;printf("a += 11.11: %f\n", a); // 888899.99// 等价于i= i%(j-2),=后面是一个整体int i = 10, j = 20;i += i % (j - 2); // i = i + i % (j - 2)printf("i += i %% (j - 2): %d\n", i); // 10 + 10 % (20 - 2) = 10 + 10 % 18 = 10 + 10 = 20// 比较运算符的优先级低于算术运算符和位运算符,但高于逻辑运算符。printf("i + j > i && i < j: %d\n", (i + j > i) && (i < j)); // 意思是 i + j > i 和 i < j 同时成立才返回真,i + j > i 的值为真,i < j 的值为假,所以结果为假// 先乘除后加减,括号内的优先级最高return 0;
}
4. 自增运算符
自增运算符:++,自减运算符:--
++: 自增运算符,将变量的值加1,并将结果赋给变量本身
--: 自减运算符,将变量的值减1,并将结果赋给变量本身
注意:自增和自减运算符的优先级高于赋值运算符,但低于算术运算符和位运算符。
注意:不能用于常量和表达式,只能用于变量。
注意:自增和自减运算符可以放在变量的前面或后面,前缀和后缀的区别在于自增和自减的顺序。
运算符 描述 示例 区别 a++
后置自增 int b = a++;
先使用 a 的值,再自增 ++a
前置自增 int b = ++a;
先自增 a,再使用新值 a--
后置自减 int b = a--;
同上逻辑 --a
前置自减 int b = --a;
同上逻辑
#include <stdio.h>
int main(int argc, char const *argv[])
{/*自增运算符:++,自减运算符:--++: 自增运算符,将变量的值加1,并将结果赋给变量本身--: 自减运算符,将变量的值减1,并将结果赋给变量本身注意:自增和自减运算符的优先级高于赋值运算符,但低于算术运算符和位运算符。注意:不能用于常量和表达式,只能用于变量。注意:自增和自减运算符可以放在变量的前面或后面,前缀和后缀的区别在于自增和自减的顺序。*/// 自增运算符,将变量的值加1,并将结果赋给变量本身 (a++)int a = 10;int b = 20;a++; // a = a + 1; // 先赋值后自增++b; // b = b + 1; // 先自增后赋值--bprintf("a++: %d\n", a); // 11printf("--b: %d\n", b);printf("++b: %d\n", b); // 21// 自减运算符,将变量的值减1,并将结果赋给变量本身 (a--)int c = 10;int d = 20;c--; // c = c - 1; // 先赋值后自减--d; // d = d - 1; // 先自减后赋值printf("c--: %d\n", c); // 9printf("--d: %d\n", d); // 19// 自增和自减运算符高于算数运算符和位运算符,但低于赋值运算符。int e = 3 * ++b; // 先处理++b,b = 21 + 1 = 22,然后再处理3*22 = 66printf("e = 3*++b: %d\n", e); // 66return 0;
}
5. 逻辑运算符
逻辑运算符:&&、||、!
逻辑与:&&,当且仅当两个操作数都为真时,结果才为真。
逻辑或:||,当至少有一个操作数为真时,结果为真
逻辑非:!,对操作数取反,真变假,假变真。
逻辑运算符的优先级:! > && > ||
用于组合或反转布尔表达式。
运算符 描述 示例 规则(短路求值) &&
逻辑与 a && b
全为真则真,否则假 ||
逻辑或 a || b
任意为真则真,否则假 !
逻辑非 !a
反转布尔值
#include <stdio.h>
int main(int argc, char const *argv[])
{/*逻辑运算符:&&、||、!逻辑与:&&,当且仅当两个操作数都为真时,结果才为真。逻辑或:||,当至少有一个操作数为真时,结果为真逻辑非:!,对操作数取反,真变假,假变真。逻辑运算符的优先级:! > && > ||*/// 逻辑与运算符:&&//短路机制:如果第一个操作数为假,则不计算第二个操作数int a = 1, b = 2, c = 3;// 逻辑与运算符的优先级高于赋值运算符,所以先计算逻辑与运算符printf(a > 0 && b > 0 && c > 0 ? "a、b、c都是正数\n" : "a、b、c不是正数\n");// 逻辑或运算符:||//短路机制:如果第一个操作数为真,则不计算第二个操作数printf(a > 0 || b > 0 || c > 0 ? "a、b、c至少有一个是正数\n" : "a、b、c都不是正数\n");// 逻辑非运算符:!printf(a != 0 ? "a不是0\n" : "a是0\n"); // a不是0// 逻辑运算符的优先级:! > && > ||// 逻辑与运算符的优先级高于逻辑或运算符,所以先计算逻辑与运算符if (a > 0 && b > 0 || c > 0){printf("a、b、c至少有一个是正数\n");}else{printf("a、b、c都不是正数\n");}return 0;
}
6. 条件运算符(三目运算符)
唯一的三元运算符,用于简化条件判断。
语法 描述 条件 ? 表达式1 : 表达式2
若条件为真,返回表达式1,否则返回表达式2
#include <stdio.h>
int main(int argc, char const *argv[])
{/*条件运算符:?:,也称为三目运算符,语法格式为:条件表达式 ? 表达式1 : 表达式2条件表达式为真时,返回表达式1的值;条件表达式为假时,返回表达式2的值。attention:条件运算符的优先级低于赋值运算符,所以在使用条件运算符时,要注意括号的使用。条件运算符的优先级:?: > = > + - > * / %三目运算符返回值的类型由表达式1和表达式2决定,如果表达式1和表达式2的类型不同,则返回值的类型为更高的类型。条件运算符的返回值可以作为赋值语句的右值,也可以作为函数的参数。*/// 条件运算符int a = 1, b = 2, c = 3;(a > b) ? printf("a大于b\n") : printf("a小于等于b\n");// 条件运算符的优先级低于赋值运算符,所以要加括号c = (a > b) ? a : b; // 如果a大于b,则b等于a,否则b等于bprintf("b = %d\n", b);return 0;
}
7. 逗号运算符
用于分隔多个表达式,返回最后一个表达式的值。
语法 描述 表达式1, 表达式2
依次执行表达式1和表达式2,返回表达式2的值
#include <stdio.h>
int main(int argc, char const *argv[])
{/*逗号运算符:,,逗号运算符的优先级最低,逗号运算符的左操作数和右操作数都要计算,返回右操作数的值。*/int a = 3;int b = (a++, ++a, a + 5); // 逗号运算符的优先级最低,逗号运算符的左操作数和右操作数都要计算,返回右操作数的值。printf("a = %d\n", a); // a = 5printf("b = %d\n", b); // b = 10int a = 3;int b = ((a + a), a + 5);printf("a = %d\n", a);printf("b = %d\n", b);return 0;
}
8. 运算符优先级(未完待续.....)
不必理会
#include <stdio.h>
int main(int argc, char const *argv[])
{/*逗号<赋值<逻辑(不包含非)<比较<算数*/// 案例一int x = 0, y = 1;int res = x++ != !y;return 0;
}
9. 位运算符
按位取反:
其余的暂时不用进行描述,简单易懂,在这里只对按位取反进行描述。
1. 补码的核心定义
在计算机中,所有整数均以补码形式存储,补码规则如下:
正数:补码 = 原码(二进制直接表示,符号位为0)。
0111 1111 1111 1111 1111 1111 1111 1111
负数:补码 = 原码取反(反码) + 1(符号位为1)。
1000 0000 0000 0000 0000 0000 0000 0000
2. 按位取反 (~) 的本质
操作对象:直接对整数的补码逐位取反(包括符号位)。
结果类型:结果仍为补码,需转换回原码才能得到十进制值。
3. 按位取反步骤(公式为~ a = -(a + 1))
取补码 (正数的补码为原码)
对补码进行取反(0为1,1为0)
取反过的补码转原码(负数的转换规则)
补码 → 原码(符号位为1,说明是负数)
符号位不变,其他位取反 → 得到原码
算出结果。
#include <stdio.h>
int main(int argc, char const *argv[])
{/*位运算原码:符号位+绝对值0:0000 0000 0000 0000 0000 0000 0000 00001:0000 0000 0000 0000 0000 0000 0000 0001-1:1000 0000 0000 0000 0000 0000 0000 0001-2:1000 0000 0000 0000 0000 0000 0000 00104:0000 0000 0000 0000 0000 0000 0000 0100 反码:符号位+绝对值的反码3:0000 0000 0000 0000 0000 0000 0000 0011-3:1111 1111 1111 1111 1111 1111 1111 1100补码:符号位+绝对值的补码3:0000 0000 0000 0000 0000 0000 0000 0011-3:1000 0000 0000 0000 0000 0000 0000 0011位运算是c语言中一种直接对二进制位进行操作的运算符,位运算符有:按位与:&,按位或:|,按位异或:^,按位取反:~,左移:<<,右移:>>。*/// 1. 按位与:& (二进制对应位都为1时候,新结果二进制对应位才为1,否则为0)int a = 3; // 0011int b = 5; // 0101int c = a & b; // 0001printf("a & b = %d\n", c); // 1/*示例*/int a1 = 4; // 0100int b1 = 5; // 0101int c1 = a1 & b1; // 0100printf("a1 & b1 = %d\n", c1); // 4// 0100 & 0101 = 0100// 2. 按位或:| (两个都为0的时候才为0,否则为1)c = a | b; // 0111printf("a | b = %d\n", c); // 7/*示例int a1 = 4; 0100 int b1 = 5; 0101 */c1 = a1 | b1; // 0101printf("a1 | b1 = %d\n", c1); // 5// 3. 按位异或:^ (两个相同为0,不同为1)c = a ^ b; // 0110printf("a ^ b = %d\n", c); // 6/*示例int a1 = 4; 0100 int b1 = 5; 0101 */c1 = a1 ^ b1; // 0001printf("a1 ^ b1 = %d\n", c1); // 1// 4. 按位取反:~ //公式为~a = -(a + 1 );c = ~a; // 1100 ,将1100转为十进制,即1100-1=1100-1=-4printf("~a = %d\n", c); // -4,注意:按位取反是对补码进行操作的,所以结果是负数/*示例int a1 = 4; 0100 利用公式可得~a为-5*/c1 = ~a1; // 1011 = -5printf("~a1 = %d\n", c1); // -5,注意:按位取反是对补码进行操作的,所以结果是负数// 5. 左移:<< (左移n位,相当于乘以2^n)c = a << 1; // 原本为0011,左移之后为0110printf("a << 1 = %d\n", c); // 6// 6. 右移:>> (右移n位,相当于除以2^n)c = a >> 1; // 原本为0011,0001printf("a >> 1 = %d\n", c); // 1// 7.位运算场景,例如:交换两个数的值 (两个相同为0,不同为1)int x = 3, y = 5;printf("x = %d, y = %d\n", x, y); // x = 3, y = 5,交换前x = x ^ y; // x = 3 ^ 5 = 6,5 = 0101,3 = 0011,结果为0110y = x ^ y; // y = 6 ^ 5 = 3,6 = 0110,5 = 0101,结果为0011x = x ^ y; // x = 6 ^ 3 = 5,6 = 0110,3 = 0011,结果为0101printf("x = %d, y = %d\n", x, y); // x = 5, y = 3,交换成功return 0;
}
相关文章:
C语言基础(day0424)
目录 一. 键盘输入 1.1 grtchar() 1.2 scanf() 总结: 二. 全局变量/局部变量(函数的分类) 1.全局变量 2.局部变量 三.C语言内存模型(堆栈内存and so on ) 3.1 栈区&#x…...
前端项目搭建集锦:vite、vue、react、antd、vant、ts、sass、eslint、prettier、浏览器扩展,开箱即用,附带项目搭建教程
前端项目搭建集锦:vite、vue、react、antd、vant、ts、sass、eslint、prettier、浏览器扩展,开箱即用,附带项目搭建教程 前言:一、Vue项目下载快速通道二、React项目下载快速通道三、BrowserPlugins项目下载快速通道四、项目搭建教…...
Next.js v15 eslint 规则配置
问题 An empty interface declaration allows any non-nullish value, including literals like 0 and "". If that’s what you want, disable this lint rule with an inline comment or configure the ‘allowInterfaces’ rule option.If you want a type meanin…...
【C语言经典算法实战】:从“移动距离”问题看矩阵坐标计算
🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 【前言】 在C语言算法学习与实践领域中,矩阵相关问题是极具代表性且高频出现的题型。“移动距离”问题将…...
算法题(133):二维差分
审题: 本题需要我们多次对某个矩形区域的数据加k,最后输出加完的数据 思路: 方法一:二维差分 本题涉及的是对二维的区间加同一个数的操作,且只显示一次最终结果,所以我们可以使用差分的方法 二维差分的性质…...
java kafka
安装 安装下载 导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apach…...
数据结构【树和二叉树】
树和二叉树 前言1.树1.1树的概念和结构1.2树的相关术语1.3树的表示方法1.4 树形结构实际运用场景 2.二叉树2.1二叉树的概念和结构2.2二叉树具备以下特点:2.3二叉树分类 3.满二叉树4.完全二叉树5.二叉树性质6.附:树和二叉树图示 前言 欢迎莅临姜行运主页…...
.NET代码保护混淆和软件许可系统——Eziriz .NET Reactor 7
.NET代码保护混淆和软件许可系统——Eziriz .NET Reactor 7 1、简介2、功能特点3、知识产权保护功能4、强大的许可系统5、软件开发工具包6、部署方式7、下载 1、简介 .NET Reactor是用于为.NET Framework编写的软件的功能强大的代码保护和软件许可系统,并且支持生成…...
运维打铁:Centos 7使用yum安装 Redis 5
文章目录 一、安装前信息说明二、安装 Redis三、创建 Redis 相关数据目录四、启动 Redis 服务五、修改 Redis 数据目录和端口1. 修改 Redis 配置文件 /etc/redis.conf2. 拷贝数据到数据目录并授权3. 重启 Redis 并连接访问 六、常见问题及解决办法1. Redis 安装失败2. Redis 服…...
【蓝桥杯】可分解的正整数
可分解的正整数 定义一种特殊的整数序列,这种序列由连续递增的整数组成,并满足以下条件: 序列长度至少为 3。序列中的数字是连续递增的整数(即相邻元素之差为 1),可以包括正整数、负整数或 0。 例如&…...
长城杯铁人三项初赛-REVERSE复现
前言 记录记录 1.LoginToMe int __fastcall main(int argc, const char **argv, const char **envp) {unsigned int v3; // eaxchar s[96]; // [rsp10h] [rbp-70h] BYREFint v6; // [rsp70h] [rbp-10h]int v7; // [rsp78h] [rbp-8h]int i; // [rsp7Ch] [rbp-4h]memset(s, 0, s…...
与终端同居日记:Shell交响曲の终极共舞指南
前言: 《与终端同居日记》特别篇:当文件们开始叠罗汉 亲爱的压缩包驯兽师: 欢迎来到「文件马戏团」!在这里,zip是那个强迫症整理狂,tar是爱玩俄罗斯套娃的魔法师,而gzip——绝对是偷偷给文件喝…...
学习threejs,使用EffectComposer后期处理组合器(采用RenderPass、ShaderPass渲染通道),案例一
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.EffectComposer 后期…...
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
文章目录 DIY 实战:从扫雷小游戏开发再探问题分解能力3 问题分解实战(自顶向下)3.2 页面渲染逻辑3.3 事件绑定逻辑 4 代码实现(自底向上)4.1 页面渲染部分4.2 事件绑定部分 写在前面 本篇将利用《Learn AI-assisted Py…...
【数据可视化-27】全球网络安全威胁数据可视化分析(2015-2024)
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
Cephalon端脑云:神经形态计算+边缘AI·重定义云端算力
前引:当算力不再是“奢侈品” ,在人工智能、3D渲染、科学计算等领域,算力一直是横亘在个人与企业面前的“高墙”。高性能服务器价格动辄数十万元,专业设备维护成本高,普通人大多是望而却步。然而,Cephalon算…...
CSS简单实用的加载动画、骨架屏有效果图
效果图 .wxml <!-- 骨架屏 --> <view wx:for"{{skeleton}}" wx:key"index" class"container center" style"--w:{{item.w}}rpx;--h:{{item.h}}rpx" /> <!-- 加载 --> <view class"arco-loading center&quo…...
图论算法体系:并查集、生成树、排序与路径搜索全解析
从图论的基础理论入门,到深搜广搜搭建起图论的骨架。 从并查集到最小生成树,从拓扑排序到最短路径。 .... 群星璀璨😉 并查集最小生成树 Prim算法Kruskal算法 拓扑排序(kahn算法)最短路径 Dijkstra算法 Dijkstra朴素Di…...
OpenAI为何觊觎Chrome?AI时代浏览器争夺战背后的深层逻辑
目录 引言:一场蓄谋已久的"蛇吞象"计划 一、Chrome:数字世界的"黄金入口" 1.1 用户规模对比:ChatGPT与Chrome的悬殊差距 1.2 Chrome的生态价值远超浏览器本身 二、OpenAI的"入口焦虑"与战略布局 2.1 AI时…...
DrissionPage 请求一次换一个代理(不重启chrome)
实现原理:通过插件实现 # !/usr/bin/python3 # -*- coding:utf-8 -*- """ author: JHC000abcgmail.com file: switch_ip.py time: 2025/4/23 22:05 desc:"""R""" 1. chrome s商店下载Proxy SwitchyOmega 3 (ZeroOme…...
JBoltAI 赋能金融文档:基于 RAG 的基金招募说明书视觉增强方案
在金融领域,基金招募说明书是投资者了解基金产品关键信息的重要文件。然而,这类文件通常以 PDF 格式呈现,内容繁杂、文本枯燥,对于普通投资者而言,理解起来存在一定难度。而如何利用 AI 技术对这类枯燥文本进行视觉增强…...
【玩转全栈】—— Django+vue3+讯飞星火API 实现前端页面实时AI答复
技术栈:vue3 element-plus axios pinia router Django5 websocket 讯飞星火API 本文将实现一个 AI 聊天对话功能,将前端用户输入问题以及之前对话发送给后端,通过 api 访问大模型,返回前端实时对话数据。 调用 讯飞星火API…...
1.1 java开发的准备工作(入门)
准备工作 一.JDK 开始写java程序之前需要安装jdk jdk是java开发工具,包含着JRE和里面的JVM(虚拟机,可以使得不同环境下都能运行Java程序),和开发工具。 二.了解写程序的三大步骤步骤 java成功运行主要需要经过代码编写,编译&a…...
socket编程基础
上一篇 --- 网络基础概念(下)https://blog.csdn.net/Small_entreprene/article/details/147320155?fromshareblogdetail&sharetypeblogdetail&sharerId147320155&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link 理…...
根据定义给出json_schema:
根据您提供的智能体定义,以下是符合JSON Schema Draft-07规范的完整架构描述(包含中文注释说明): {"$schema": ""title": "智能体架构规范","type": "object","req…...
深入微服务核心:从架构设计到规模化
作者:腾讯云开发者 原文:深入微服务核心:从架构设计到规模化 01 微服务 什么是微服务? 微服务就是一些协同工作的小而自治的服务。我们在一个单体系统中,通常会采用一些抽象层或者模块来保证代码的内聚性,…...
linux与c语言基础知识(未全部完成)
文章很多处理论,没办法写出来,(linux的一些理论问题,我有时间后,会逐个解决) 文章大多数的理论来字这个链接, C语言快速入门-C语言基础知识-CSDN博客 一. linux(Ubuntu) …...
【专题刷题】滑动窗口(四):
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
小白自学python第一天
学习python的第一天 一、常用的值类型(先来粗略认识一下~) 类型说明数字(number)包含整型(int)、浮点型(float)、复数(complex)、布尔(boolean&…...
Redis 服务自动开启、设置密码和闪退问题
一、Redis 服务自动开启 1、以管理员身份运行命令提示符 右键点击“命令提示符”图标,选择“以管理员身份运行”。 2、注册为 Windows 服务 redis-server --service-install 3、启动服务 redis-server --service-start 4、测试 Redis 连接 redis-cli ping …...
2025年渗透测试面试题总结-拷打题库14(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库14 1. WAF存在的意义 2. 威胁感知能力衡量指标 3. 感知规则有效性…...
java后端开发day35--集合进阶(四)--双列集合:MapHashMapTreeMap
(以下内容全部来自上述课程) 1.双列集合 1.1 特点 双列集合一次需要存一对数据,分别为键和值键不能重复,值可以重复键和值是一一对应的,每一个键只能找到自己对应的值键值这个整体,我们称之为“键值对”…...
进行网页开发时,怎样把function()中变量值在控制台输出,查看?
在网页开发过程中,为了及时了解JavaScript中的function函数中的变量值,可以用控制台命令console.log()把变量的值在控制台输出,方便调试时对函数变量值进行了解。 看下面的一段示例: <!DOCTYPE html> <html> &l…...
【计算机网络】现代网络技术核心架构与实战解析
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:TCP服务端/客户端通信案例2:Wireshark抓包分析 三、性能对比测试方法…...
Python内置函数---bool()
用于将任意对象转换为布尔值(True或False) 1. 基本语法与参数 bool(x) - 参数:x为可选参数,可以是任意Python对象(如数值、字符串、列表、自定义对象等)。 - 返回值:根据x的真值性返回True或Fa…...
Vue 3中如何封装API请求:提升开发效率的最佳实践
在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时。随着Vue 3的广泛应用,如何高效地封装API请求,既能提升代码的可维护性,又能确保代码的高复用性,成为了很多开发者关注的话题。 在本文中&…...
【Redis】redis主从哨兵
Redis 主从复制 在访问量极高的场景下,单台 Redis 已难以承载所有请求,且单点故障风险高。通过主从复制,可以实现读写分离、数据备份与高可用。 概念 主节点(Master):负责写操作,将数据变更同…...
16.第二阶段x64游戏实战-分析二叉树结构
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:15.第二阶段x64游戏实战-分析怪物血量(遍历周围) 首先通…...
vue | 不同 vue 版本对复杂泛型的支持情况 · vue3.2 VS vue3.5
省流总结:defineProps 的泛型能力,来直接推导第三方组件的 props 类型 引入第三方库的类型,并直接在 <script setup> 中作为 props 使用。这种类型一般是复杂泛型(包含联合类型、可选属性、交叉类型、条件类型等࿰…...
OpenGL学习笔记(Blinn-Phong、伽马矫正、阴影)
目录 Blinn-PhongGamma矫正GammaGamma矫正实现方法sRGB纹理衰减 阴影shadow mapping渲染阴影改进阴影贴图PCF GitHub主页:https://github.com/sdpyy1 OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdp…...
GPLT-2025年第十届团体程序设计天梯赛总决赛题解(2025天梯赛题解,266分)
今天偶然发现天梯赛的代码还保存着,于是决定写下这篇题解,也算是复盘一下了 L1本来是打算写的稳妥点,最后在L1-6又想省时间,又忘记了insert,replace这些方法怎么用,也不想花时间写一个文件测试,…...
day4 pandas学习
%pip install openxyxl 找一个自己觉得有意思的文件。我找的是成绩单来玩。 这节学的比较耗时了,大概用了60分钟。 import pandas as pd data2 pd.read_csv(rD:\python代码区\代码随想录挑战-调试区\python训练营\1_计算类专业分流学生成绩排名.csv) #print(data)…...
【Java学习笔记】循环结构
循环结构 一、for循环 for循环结构 for(循环变量初始化;循环条件;循环变量迭代){循环操作(可以多条语句) }for循环写死循环 for(;;){语句 }注意点:循环变量的初始化在for语句内,属于是局部变量,在全局中会出现未定义…...
URP-UGUI交互功能实现
一、非代码层面实现交互(SetActive) Button :在OnClick()中添加SetActive方法(但是此时只首次有效) Toggle :在OnClick()中添加动态的SetActive方法 &#…...
08-IDEA企业开发工具-集成AI插件通义灵码
需要登陆才可使用!!! 1. 安装AI编程插件 找到插件: 在IDEA的设置中,找到插件(Plugins)部分。安装插件: 搜索“通义灵码”,找到后点击安装(Install),接受条款…...
解决报错:this[kHandle] = new _Hash(algorithm, xofLen);
前端项目编译报错: node:internal/crypto/hash:68this[kHandle] new _Hash(algorithm, xofLen);^Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:68:19)at Object.createHash (node:crypto:138:10)at modu…...
使用 Streamlit 打造一个简单的照片墙应用
在现代 web 开发中,快速构建交互式应用是一项重要的技能。Streamlit 是一个强大的 Python 库,允许开发者以最小的代码量创建美观且功能丰富的 web 应用。今天,我们将通过分析一段简单的 Streamlit 代码,展示如何构建一个照片墙应用…...
深度学习优化器和调度器的选择和推荐
一、常用优化器对比 1. 随机梯度下降(SGD) 原理:每次迭代使用小批量数据计算梯度并更新参数。优点:实现简单,适合大规模数据集。缺点:收敛速度慢,容易陷入局部最优或鞍点。适用场景࿱…...
“时间”,在数据处理中的真身——弼马温一般『无所不能』(DeepSeek)
电子表格时间处理真理:数值存储最瘦身,真身闯关通四海。 笔记模板由python脚本于2025-04-23 22:25:59创建,本篇笔记适合喜欢在电子表格中探求时间格式的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验…...
为什么Spring中@Bean注解默认创建单例Bean
在Spring框架中,使用Bean注解定义的对象默认确实是单例的,这是由Spring容器的设计哲学和实际需求决定的。下面我从多个角度解释这一设计选择的原因和机制。 1. Spring Bean作用域基础 Spring定义了多种Bean作用域,其中默认是单例(Singleton…...