C语言基础知识
重点
- C语言的字符集、关键字和标识符
- C语言的基本组成
本章知识点
- C语言的发展和特点
- C语言的字符集、关键字和标识符;
- C程序的基本语句分类
- C程序的基本组成
- C程序的开发环境。
掌握C语言的基本组成,了解C语言的运行步骤的调试方法
C语言特点
C语言允许直接对计算机硬件进行曹祖据哦,既具有高级语言的功能,又具有低级语言的功能,所以也被称为“中级语言”,可用来编写系统软件
- 结构化语言
- C语言具有良好的结构化(顺序、选择、循环)语句。
- C语言的函数是程序的基本模块,便于实现程序的模块化
- 运算能力强大:C语言提供三十多种运算符,表达式的种类多样。
- 数据类型丰富:包括整型、实型、字符型、数组型、结构体类型、指针、空类型等。
- 具有预处理能力
- 可移植性好
- 程序执行效率高:由C源程序生成目标代码的效率一般仅比汇编语言低10%~20%
- 程序设计自由度大:C语言的语法限制不严格,允许程序员具有自由度
字符集
C语言的字符集是ASCII
。主要包含下列四类:
- 大小写英文字母A\~Z、a\~z (52个)
- 数字0、1、2、…、9 (10个)
- 非字母、非数字的可现实字符(33个),既键盘可输入的字符,如:+ - “ ~ ( > 等。
- 转义字符
关键字
注意:所有的保留字均有小写字母组成,一旦有一个字母大写,其不再是保留字原来的含义、
数据类型:char
、double
、enum
、float
、int
、long
、shnort
、signed
、struct
、union
、unsigned
、void
控制语句:break
、case
、continue
、default
、do
、else
、for
、goto
、if
、return
、switch
、while
存储类型:auto
、extern
、register
、static
其他关键字:const
、sizeof
、typedef
、volatile
词汇分类
- 常量:C语言运行中其值不发生改变的量。例如-10、12.5等
- 标识符:C程序中使用的变量名、函数名和标号等统称标识符
- 关键字:由C语言规定的具有特定意义的字符串
- 运算符:C语言用于计算的符号,如+ - * \
- 多行注释:
/*注释*/
单行注释://注释
- 分隔符:C语言的分隔符包括括号和空格两种
基础语句分类
- 数据定义语句:用来定义程序中使用的各种能存放数据对象的名称和特性 -
int a,b,c;
- 赋值语句:形如
变量 = 表达式
的语句,功能市计算表达式的值并赋予变量 -a = 2 ; b =3;
- 函数调用语句:形如
函数名(实际参数表)
的语句,功能市调用指定函数 -a = avg*(x,y,z);
- 表达式语句:仅由任何表达式组成的语句 -
c = a+b;
-
流程控制语句:用来控制程序执行过程的语句
- 选择控制语句:
if() ~ else ~
switch
- 循环控制语句:
for() ~
while() ~
do ~ while()
- 中止语句:
break
- 继续循环语句:
continue
- 返回语句: return
- 无条件转移语句: goto
- 选择控制语句:
- 复合语句:用花括号括住的一组任一语句 (埋:复合语句的作用?)(填:判断后需要执行需要多条语句一起执行时,可以使用复合语句)
main(){
.....
{......} // 复合语句。 注意:右括号后不需要加;
....
}
-
空语句:无任何操作的语句,既只由分号组成的语句,一般在程序中用作空循环体。
-
while(getchar() != '\n') ; /* 这里的循环体为空语句,表示循环体什么都不做 注意:while(getchar() != '\n');和上面程序段功能一样 */
-
-
其他语句:包含编译预处理命令、用户自定义类型语句等 -
#include "stdio.h"
普通的C语言例题
- 从键盘输入两个整数,计算其乘积 (主函数实现)
#include <stdio.h> /*编译预处理命令*/
int main(void){ /*主函数*/
int n1, n2, result; /*定义保存两个整数及其乘积的变量*/
printf("please input the two numbers:\n"); //屏幕显示提示信息
scanf("%d,%d", &n1, &n2); //从键盘输入两个整数并分别保存在变量n1和n2
result = n1*n2;
printf("the result is:%d\n", result); //输出变量result中的两个整数的乘积
return 0; //返回
}
/*
please input the two numbers:
2,3
the result is:6
*/
- 从键盘输入两个整数,计算其乘积(多函数实现)
#include <stdio.h>
int mul(n1, n2){
return n1 * n2;
}
void main(void){ /*主函数*/
int n1, n2, result; /*定义保存两个整数及其乘积的变量*/
printf("please input the two numbers:\n"); //屏幕显示提示信息
scanf("%d,%d", &n1, &n2); //从键盘输入两个整数并分别保存在变量n1和n2
result = mul(n1, n2);
printf("the result is:%d\n", result); //输出变量result中的两个整数的乘积
}
/*
please input the two numbers:
3,5
the result is:15
*/
C程序的基本组成特点
-
函数是C程序的基本单位。每个C程序是由一个或多个函数构成。每个C程序有且仅有一个主函数,该主函数的函数名规定为main。
-
每个函数(包含主函数)的定义分为两个部分:函数首部和函数体。
-
函数首部: 返回值的类型 函数名(类型 形式参数名, ...) 函数体: { 数据定义部分 实现函数功能的语句串 } 注意:当函数没有返回值时写void
-
-
C程序中每个语句以“分号”作为语句的结束,“分号”是C语言的组成部分,不可以省略。但预处理命令和函数首部之后不能加分号。
-
#include <stdio.h> //编译预处理命令 int main(void) //函数首部不是一条完整的语句
-
-
C语言本身没有输入/输出语句,而是通过调用库函数
scanf()
、printf()
、getchar()
、putchar()
实现的 -
C语言的任任意位置都可以加注释,注释不编译。单行注释
\\注释
多行注释\*注释*\
-
程序的书写格式灵活,一行客书写多条语句,一条语句可以写在多行上,可以任意插入空格和回车。但为了程序清单层次分明、便于阅读,通常都采用缩进并对其的书写方法。一条说明一条语句占一行。使用空格或TAB缩进{}对齐。有足够的注释。有合适的空行
-
C语言中主函数和其他函数的位置是任意的,但程序执行总时从主函数开始,并在主函数结束。其他函数总是通过函数调用语句被执行
-
主函数可以调用其他函数;任何其他函数都可以相互调用,但不能调用主函数。
-
C程序中可以有预处理命令(例如
include
命令),通常预处理命令应放在程序的最前面。 -
C语言编译系统区分字母大小写。
C语言的运行步骤
C程序的调试
程序的错误分:语法错误和逻辑错误。
语法错误能够在编译过程中被发现并修改;
逻辑错误的程序往往可以顺利编译甚至执行,但执行的结果不同于预期。由于较难准确定位逻辑错误,所以程序开发环境一般都会提供程序调试工具来观察程序中各变量、寄存器等值的变化,以便发现程序中的逻辑错误。
调试手段:设置断点、重启调试、停止调试、逐语句调试、逐过程调试
数据类型、运算符和表达式
重点
- 基本数据类型常量和字符串常量的书写方法
- 变量的定义、赋值、初始化以及使用方法
- 基本运算符的运算规则、优先级和结合性
- 表达式的构成规则和计算
难点
- 运算符的优先级
- 混合表达式的计算
C语言的数据类型及其关系图
C语言数据类型的说命
- C语言规定在使用一个数据之前,必须定义数据的类型,因为数据类型决定了数据占用内存的字节数、取值范围以及在其桑可以进行的操作等。
- 如:
int a = 2; // 系统会分配两个字节给变量,直到主动释放或者程序结束 - 定义好了数据类型,程序就可以知道这个变量可以使用什么方法
- 如:
- C语言的数据有常量和变量之分,它们分别属于上述的类型。
- 数据类型丰富,包括整型、实行型、字符型、数组型、结构体类型、指针型和空类型等。
常量的基本概念
- 常量又称为常数,是程序运行过程中其值不能改变的数据。
- C语言规定常量包括:整型常量(1)、实型常量(1.2)、字符型常量(‘t’)、字符串常量(“test”)、符号常量(埋坑:什么是符号常量)
- 使用常量时,不需要事先定义,只需要在程序中直接写出。常量的类型客通过书写形式自动识别,无需定义。
整型常量
- 十进制整数:由数字0-9和正负号表示。如:
0、-111、+15、21
等 - 八进制数(以0开头):例如:
00、-0111、+015、021
(埋:二进制转八进制)(填:三合一法,101110.101 = 56.5
) - 十六进制整数(以0x开头):例如:
0x0、-0x111、+0xff、0x2d
说明:
- 正整数前面的
“+”
可以省略。 - 整型常量在16位计算机中占用2个字节,数值范围位$-2^{15} ~ (2^{15}-1) = -32768~32767$
- 长整型常量(在整型的末尾加个字符
L
):- 例如:
0L(十进制)
、0111L(八进制)
、0x15L(十六进制)
长整型常量在计算机中占用4个字节。其取值范围可达$-2^{31} ~ (2^{31} -1)$(埋坑:计算机出具体数值) -
注意:10和10L是不同的整型常量,虽然它们由相同的数值,但它们在内存中占用不同数量的字节。
(埋坑:为什么要这样设计,常量不会变量,为什么要占用那么多字节)(填坑:长整型的出现是为了存放计算结果,如:$10^{10}=100亿$,使用i整型常量是不能装不下的,这时候可以放到长整型中)
- 例如:
实型常量
实型常量只使用十进制,它的书写形式有两种
- 十进制数形式:(必须有小数点)如:
0.123, .123, 123.0, 0.0, -.123, 12.
- 指数形式:(e或E之前必须有数字;)指数必须为整数)如:
12.3e3, 123E2, 1.23e4
错误:e-5, 12.E-3.5
1.说明:实型常量在计算机占用4个字节,数值范围都是$-10^38 ~ 10^38$
2.实型常量有效数字是七位。例如,1.234567789和1.234567是相同的。(埋坑:有效数是说明)
字符常量
字符常量:用一对单引号前后括住的单个字符。例如,‘a’, ‘1’, '%', 'A'
转移字符:一种特殊形式的字符常量,以反斜杠\
开头,后面跟单个字符或若干个字符组成。
符号 | 符号 | ||
---|---|---|---|
\n |
回车换行符 | \a |
响铃符号 |
\t |
Tab符号 | \" |
双引号 |
\v |
垂直制表符 | \' |
单引号 |
\b |
左退一格符号 | \\ |
反斜杠 |
\r |
回车符号 | \ddd |
1~3位进制数ddd对应的ASCII字符 |
\f |
换页符号 | \xhh |
1~2位16进制数hh对应的ASCII字符 |
字符串常量
-
字符串常量简称为“字符串”。字符串就是用两个双引号
“”
前后括住的一串字符。例如:“abc”, "123", "A", "\101\n\x43"
-
空字符串:没有字符的字符串称为空字符串。例如:
“”
-
字符串的长度:一个字符串中所有字符的个数称为该字符串的长度。例如:
""
的长度为0;“abc12c”
的长度为5;“\101\n\x43ab”
的长度为5
说明:
- 空串与空格串是不同的。空串不含任何字符,长度为0;空格串是包含若干空格字符的字符串,其长度为所含空格字符的个数。
- 每个字符串在内存中占用的字节数等于字符串的长度+1、其中最后一个字节存放的字符为”空字符串“,其值为0,书写时常用转义字符“\0”来表示,称为字符串结束标记。例如:
“China”
==China\0
符号常量
- 符号常量的定义方法如下:
#define 符号常量 常量
(埋坑:定义符号常量的后,符号被赋值会发生什么) - 例如:
#define PI 3.14159 // 定义了符号常量PI,其值等于实型常量3.14159
#define R 10 // 定义了符号常量R,其值等于整型常量10
#define A 'A' //定义了符号常量A,其值等于字符常量’A‘
说明:
- 符号常量按标识符的规则构成,建议用大写的英文字符组成。其中的常量可以时任何类型的常量
- 符号常量的定义一般放在程序的开头,每个定义必须独占一行,其后不跟分号
;
, - 在程序中使用符号常量有两点好处:提高程序的可读性;便于程序修改
变量的基本概念
- 变量:在程序运行过程中,其值可以被改变的量称为变量
(埋坑:短整型变量如果放入超过长度的数会怎样)
(埋坑:什么时候int占用字节数时2位,什么时候int占用字节数时4位)
(埋坑:字符串的取值范围的作用。) - 变量的三个要素:
- 变量名:每个变量都必须有一个名字~变量名,变量命名遵循标识符命名规则
- 变量值:变量中所保存的数据称为该变量的值,在程序运行过程中,变量值存储在内存中。
- 变量类型:变量类型可以时任何一种数据类型。数据类型Xmind文件
变量定义和初始化
数据类型符 变量名1 [,变量名2,...];
- 说明:对变量的定义可以放在函数之外,也可以放在函数体中或复合语句中。如果时放在函数体或复合语句中,则必须集中放在最前面
(埋坑:变量未赋值使用会怎样) - 说明:值在-128和127之间的
int
、short
、long
的变量 ==字符型变量
值在0~255之间的unsigned
、unsigned short
、unsigned long
的变量 == 字符型变量
int r, s; //定义2个有符号基本整型变量
short m, n; // 定义2个有符号的短整型变量
long p, q; //定义2个有符号长整型变量
unsigned i, j, k; //定义3个无符号基本整型变量
float r, s; //定义2个单进度实型变量
double f1, f2; //定义2个双精度实型变量
char c1, c2; //定义2个字符型变量,全局变量,作用域整个文件
void main(){
int me=2; //定义在函数之内的变量,作用域只在函数内
{int fu;
fu = me +c1; //定义在复合语句的变量,作用域只在复合语句中
}
}
#include <stdio.h>
/*
说明:
值在-128和127之间的`int`、`short`、`long`的变量 == `字符型变量`
值在0~255之间的`unsigned`、`unsigned short`、`unsigned long`的变量 == 字符型变量
*/
void main(void){
char a =97;
printf("The value of a: %c", a);
}
/*result:
The value of a: a
*/
有名常量的i定义
C语言中,如果定义了变量并赋予其初值,但不希望在程序中对其值进行修改,则可以将该变量定义为又名常量。有名常量定义语句的一般格式如下:
// 格式:const 数据类型 变量名1=初值1;
const int j=1;
const float f1=1.;
逻辑运算符和逻辑表达式
名称 | 运算符 | 对象数与位置 | 运算规则 | 对象类型 | 结果类型 | 结合性 |
---|---|---|---|---|---|---|
逻辑非 | ! | 单目前缀 | 数值型或字符型 | 逻辑值0或1(整型) | 自右向左 | |
逻辑与 | && | 双目前缀 | 数值型或字符型 | 逻辑值0或1(整型) | 自左向右 | |
逻辑或 | || | 双目前缀 | 数值型或字符型 | 逻辑值0或1(整型) | 自左向右 |
- 单目:只需要一个值就可以运算
- 双目:需要两个值才可以运算
说明:
-
逻辑运算的结果是整型数0或1
-
逻辑运算符的优先级如下:
!
优先于双目运算符 优先于 关系运算符 优先级&&
优先于||
-
用
&&
对两个表达式进行计算时,若第一个表达式的值为“假”,则运算结果与第二个表达式的值无关,结果肯定为“假”,所以C语言规定此时**第二个表达式将不再计算**。例:
c
int result,a=5;
result = 0&&(a++);
printf("results is %d\n" , result); // results is 0
printf("%d" , a); // 5 值依然是5,因为第一个表达式的值为“假”用
- 用
||
对两个表达式进行计算时,若第一个为“真”,则运算结果与第二个表达式的值无关,结果肯定为“真”,所以C语言规定此时**第二个表达式也不再计算**。例:
c
int result,a=5;
result = 1||(a++);
printf("results is %d\n" , result); //
printf("%d" , a); // 5 因为第一个表达式的值为“真”用
- 逻辑运算符两侧的运算对象可以是任何类型的数据的,如整型、实型、字符型等。系统一律当作逻辑值进行解释,既
非0
为逻辑真;0
为逻辑假
逻辑表达式:由逻辑运算符链接表达式构成。
int x=3, y=100, result;
float f1=1.0, f2=2.1;
char c='d';
printf("result is %d of f1&&f2&&c", f1&&f2&&c); //result is 1 of f1&&f2&&c
printf("result is %d of f1>f2||!c", f1>f2||!c); //result is 1 of f1&&f2&&c
printf("result is %d of x+97==y&&y==c", x+97==y&&y==c); //result is 1 of x+97==y&&y==c
实际运用的例子
数学问题 | C语言的表达式 |
---|---|
a<b<c | a<b && b<c |
ch是数字字符 | ch>='0' && ch<='9' |
ch是字符 | ch>='A'&&ch<='Z' || ch>='a'&&ch<='z' |
ch是字符串结束符 | ch=='\0' |
ch不是回车换行符 | ch!=‘\n’ |
整型变量a中是奇数 | a%2==1 |
整型变量a中是偶数 | a%2==0 |
复合赋值运算符
名称 | 运算符 | 对象数和位置 | 运算规则 | 对象类型 | 结果类型 |
---|---|---|---|---|---|
加赋值 | += | 双目中缀 | a+=b 相当 a=a+(b) | 数值型 | 数值型 |
减赋值 | -= | 双目中缀 | a-=b 相当 a=a-(b) | 数值型 | 数值型 |
乘赋值 | *= |
双目中缀 | a*=b 相当 a=a*(b) |
数值型 | 数值型 |
除赋值 | /= | 双目中缀 | a/=b 相当 a=a/(b) | 数值型 | 数值型 |
模赋值 | %= | 双目中缀 | a%=b 相当 a=a%(b) | 整型 | 整型 |
-
算术复合赋值运算符的优先级如下:
算术运算符 优先于 关系运算符 优先于 双目运算符 优先于 算术复合赋值运算符
算术复合运赋值运算符和赋值运算符的优先级是相同的,结合性都是自右向左的。 -
算术复合赋值运算符右边的表达式是自动加括号的。例如:
“c%=a-3” 不能理解为"c=c%a-3,应理解为"c=c%(a-3)"
-
赋值运算符:由赋值运算符或复合赋值运算符连接变量和表达式构成。
int i=1,j; float f=2.0; f+=i-1; // 即f=2.0+(1.1), 表达式的值是2.0,f的值2.0 i=i>=f; // 即i=(1>=2.0) 表达式的值是0, i的值是0 j=!(i==1); // 即j=!(1==1), 表达式的值是0, j的值是0 i=j=2; // 表达式的值为2,i的值为2,j的值为2 //例子1 int m1=1,m2=10,m3=10,m4=10; m1+=m2-=m3*=m4/=2; //表达式的值为-30 int m=10; m+=m-=m*m; // 第一次计算错误:表达式的值为-80 10*10 -> 10-100- > (-90)+10 // 第二次看到答案后计算:0 10*10 -> 100-100 -> 0+0 // 第三次思考后答案:表达式的值为-180 10*10 -> 10-100 -> -90+-90
逗号运算符和逗号表达式
运算符 | 对象数与位置 | 运算规则 | 对象类型 | 结果类型 | 结合性 |
---|---|---|---|---|---|
, | 双目中缀 | 依次计算左边、右边表达式 | 任何类型表达式 | 右边的表达式的类型 | 自左向右 |
逗号表达式:用逗号运算符把两个或多个表达式连接起来构成逗号表达式,构成规则如下:表达式1,表达式2,...
int i=1,j; float f=2.0; char ch='b';
i+1, ch+1; // 既1+1, 98+1
i>ch, i>=f; // 既i>98; 1>=2.0
i=j=2, j=3 ;
// 第一次计算,i的值为2。j=3 -> j=2 -> i=2
// 第二次计算,j的值为3。 j=2 -> i=j -> j=3
int a=2, b=2, c,d,e,f;
t= d=a--, e=d--, f=--e;
printf("t=%d", t) // t=1
// 第一次计算 d = a-1
// 第二次计算 d = a, a-1
a=2*6,a*3,a+5;
// 第一次计算,表达式41。 a=2*6 -> a=12*3 -> a=36+5
// 第二次计算,表达式17。 a=2*6 -> 12*3 ->a=12+5
条件运算符
运算符 | 对象数与位置 | 运算规则 | 对象类型 | 结果类型 | 结合性 |
---|---|---|---|---|---|
? : | 三目中缀 | 对e1?e2:e3 e1为真,获得e2 e1为假,获得e3 |
表达式 | e2(e3)的类型 | 自右向左 |
条件运算符:C语言唯一的三目运算符
说明:其他运算符 优先于 条件运算符 优先于 赋值、算术复合赋值运算符 优先于 逗号运算符
int a=2, b=2, c=2, d=2, t;
t = a==1?(c=1):(d=3);
printf(" t=%d",t); // t=3, d=3
位运算符和位运算符表达式
十进制转二进制 - 学习地址
方法1:整除法,用2整除十进制数,得到一个商和余数在用2去除商,又会得到商和余数,如此重复,直到商小于1时为止,然后把先得到的余数作为二进制的低位有效位,后得到的余数作为二进制的高位有效位
方法2:先将十进制分解为2的不同整数次幂的和,然后将这些数分别转化为二进制数,最后将这些二进制数相加就得到结果。
例如,将十进制数81转换为二进制数。
二进制转换为十进制 -学习地址
方法1:从右向左用二进制的每个数去乘与2的的对应次方并递增
方法2:采用幂乘加法。
二进制转换未八进制
方法:将二进制右向左每三位分为一组,最左端不够三位补零,最后将每小组转换为一位八进制数
例如,将二进制数为11010
转换为相应的八进制数
分组:011 010
,转换为八进制数32,表示为32
八进制转换为二进制
方法:从右向左每位八进制数转换为三位二进制,然后去掉最左端的零。
例如,将八进制数为32转换为相应的二进制数
32按位转换011 011
二进制转换为十六进制
方法:将二进制右向左每四位分为一组,最左端不够四位补零,最后将小组转换为一位十六进制数
例如,将二进制数11010
转换为相应的十六进制数
分组:0001 1010
, 转换为十六进制数1A,表示为0x1A
十六进转换为制二进制
方法:将二进制右向左每四位分为一组,最左端不够四位补零,最后将小组转换为一位十六进制数
例如,将二进制数11010
转换为相应的十六进制数
分组:0001 1010
, 转换为十六进制数1A,表示为0x1A
原码 、返码、补码 学习地址
计算机系统中整数一律采用补码表示(存储),原因在于使用补码,可以将符号位和其他为统一处理;同时,减法也可按加法来处理。另外,两个使用补码表示的数相加,如果最高位(符号位)有进位,则进位被舍弃
计算机中数值的表示
-
二进制位与字节:字节是内存的基本单位,1字节由8个二进制(bit)组成,每个二进制位为0或1。1字节中各二进制位的编码如下图
-
数值的原码表示:将最高位作为符号位(0表示整数,1表示负数),其余各位代表数值本身的绝对值(以二进制形式表示)的表示形式、
-9的原码是10001001 +9的原码是00001001
-
数值的反码表示:整数的反码与原码相同,负数的反码的符号位为1,取与各位为该绝对值的原码按位取反。
+9的反码是00001001 -9的反码是11110110
-
数值的补码表示:整数的补码与原码相同,负数的补码的符号为1,其余各位为该数绝对值的原码按位取反;然后在末位加1。 学习地址
+9的补码是00001001 -9的原码是10001001--> 除符号位其余各位按位取反11110110--> 末位加1得到-9的补码是11110111 -8的原码是10001000--> 除符号位其余各位按位取反11110111--> 末位加1得到-8的补码是11111000 # -8计算过程因为11110111加1后无法之前的几位无法容纳,所以进位1+1 -> 2+2 -> 4+4 -> 8
位逻辑运算符
- 运算对象只能是整型或字符型。除
按位非
为单目运算符外,其余均为双目运算符。 - 参与逻辑运算时,运算对象以二进制形式进行相应的按位运算
~
优先于双目算数运算符
优先与关系运算符
优先于&
优先于^
优先于|
优先于双目运算符
~
与单目逻辑运算符
、自增
、自减
、单目算数运算符
、长度运算符的优先级相同
,结合性是从右至左。
名称 | 运算符 | 对象数与位置 | 运算规则 | 对象类型 | 结果类型 | 结合性 |
---|---|---|---|---|---|---|
位非 | ~ | 单目中缀 | \~1为0,\~0为1 | 整型 | 整型 | 自右向左 |
位与 | & | 单目中缀 | 参见下表 | 整型 | 整型 | 自右向左 |
位或 | | | 双目中缀 | 参见下表 | 整型 | 整型 | 自左向右 |
按位加 | ^ | 双目中缀 | 参见下表 | 整型 | 整型 | 自左向右 |
a | b | a&b | a|b | a^0 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
注意:位逻辑运算符用于数据中的二进制位进行测试、置位。
按位与
- 按位与的主要作用是提取(或保留)一个数的某些位,其余各位置0.
- 例如,将二进制数是00010010高四位不变,低四位置0.
- 方法:
00010010 & 11110000
- 结果:
00010000
按位或
- 按位或的主要作用是将一个数的某(些)位置1,其余各位不变。
- 例如,将二进制数是00010010高四位不变,低四位置1。
- 方法:
00010010 | 00001111
- 结果:
00011111
按位异或
- 按位异或的主要作用是使一个数的某些位反转(既原来为1的变为0,为0的变为1),其余各位不变
- 例如,将二进制数是00010010高四位不变,第四位反转
- 方法:
00010010 ^ 00001111
- 结果:
00011101
按位非
- 按位非的主要作用是间接地构造一个函数,以增强程序的可移植性。