三、初识C语言(3)

1.操作符

(1)算术操作符

    • * / %

商 余(取模)

小算法:

若a<b,则a%b = a

若a%b = c,则0 <= c <= b-1

若两个int 类型数相除,结果有小数会被舍弃。

保留小数:强制类型转换 *1.0

例:int a = 6;

int b = 5;

printf("%f\n",a*1.0/b);

(2)移(二进制补码位)位操作符

>>右移

根据数据类型,二进制补码整体移动,末尾补0。

<<左移

例:int a = 1;

int b = a<<1;

则a = 1, b = 2

(3)位操作符

& 按位与 | 按位或 ^ 按位异或

例:int a = 3;//011

int b = 5;//101

int c = a&b;//001

则c = 1

(4)赋值操作符

== += -= *= /= &= ^= |= >>= <<=

赋值: =

判断相等:==

例:a += 10;相当于 a = a+10;

(5)单目操作符

1.逻辑反操作 !

C语言中,用0表示假,一切的非0表示真。

例:int a = 10; int a = 0;

则!a = 0 则!a = 1

2.sizeof

计算变量/类型所占内存大小,以字节为单位。

3.按(二进制补码位)位取反 ~

数字在内存中都是以二进制补码的形式存储的,最高位为符号位,正数:0,负数:1。

原码 ------> 反码 ------> 补码

符号位不变, 反码+1

其余取反。

正数的原码 = 反码 = 补码

负数要变换

例:int a = 0;

int b = ~a;

则b = -1

a:0.......0 32个0

~a:1.....1 32个1(b的补码)-> 11111111.....0(b的反码)-> 100000....1(b的原码)

printf打印的是数字的原码

4.前置 -- ,后置-- 前置++ 后置 ++

例:前置 ++(先++,后使用) 后置++(先使用,后++)

int a = 10; int a = 10;

int b = ++a; int b = a++;

则a = 11,b = 11 则a = 11,b = 10

5.强制类型转换 (类型)

例:int a = (int) 3.14;

则a = 3

直接截取整数部分

(6)关系操作符

> >= < <= != ==

(7)逻辑操作符

&& 逻辑与 || 逻辑或

例:int a = 3;

int b = 5;

int c = a&&b;

则c = 1

(8)条件操作符(三目操作符)

exp1?exp2:exp3;

例:max = (a>b?a:b);

(9)逗号表达式

exp1,exp2,exp3,....,expN

逗号表达式最终值为最右边的值,并且逗号表达式优先级最低。

例:int a = (5,6); a = (a = 3*5,a*4,a = a+5);

则a = 6 则a = 15+5 = 20

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//逗号表达式
int main()
{
	int x = 1;
	int y = 1;
	int z = 0;
	z = (x++,y++,++y);
	printf("第一个逗号表达式结果为:\n");
	printf("%d %d %d\n",x,y,z);//2 3 3

	x = 1;
	y = 1;
	z = (x++,y++,y++);
	printf("第二个逗号表达式结果为:\n");
	printf("%d %d %d\n",x,y,z);//2 3 2

	x = 1;
	y = 1;
	z = x++,y++,++y;
	printf("第三个逗号表达式结果为:\n");
	printf("%d %d %d\n",x,y,z);//2 3 1

	return 0;
}

(10)漏掉的操作符

下标引用:[ ]

函数调用:()

结构体成员:. ->

取地址符号:&

指针:*

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//操作符
int main()
{	
//1.算术操作符
	int a = 5/2;
	int b = 5%2;

//2.移(二进制位)位操作符
	int A = 1;
	int B = A<<1;

//3.位(二进制位)操作符
	int x = 3;
	int y = 5; 
	int z = x&y;

//4.赋值操作符
	int i = 10;

//5.单目操作符
	//(1)逻辑反操作
	int I = 10;

	//(2)sizeof
	int j = 1;

	//(3)按位取反操作
	int J = 0;

	//(4)前置/后置  ++/--
	int m = 10;
	int n = ++m;

	//(5)强制类型转换
	int q = (int)3.14;

//6.关系操作符

//7.逻辑操作符(逻辑值运算)
	int M = 3;
	int N = 5;
	int w = M&&N;

//8.条件操作符(三目操作符)
	int s = 5;
	int o = 100;
	int max;
	max = (s>o?s:o);

//9.逗号表达式:exp1,exp2,exp3,...,expN
//10.下标引用操作符 [],函数调用操作符 () ,结构体 . ->
//11.其它操作符 & *

	printf("1.算术操作符:\n");
	printf("商数和余数为:\n");
	printf("a=%d\n",a);
	printf("b=%d\n",b);

	printf("2.移位操作符:\n");
	printf("左移一位后为:\n");
	printf("A=%d\n",A);
	printf("B=%d\n",B);

	printf("3.位操作符:\n");
	printf("按位与后为:\n");
	printf("z=%d\n",z);

	printf("4.赋值操作符:\n");
	 i+=20;
	printf("赋值操作后为:\n");
	printf("%d\n",i);

	printf("5.单目操作符:\n");
	printf("(1)逻辑反操作后为:\n");
	printf("%d\n",I);
	printf("%d\n",!I);

	printf("(2)sizeof操作后为:\n");
	printf("%d\n",sizeof(j));

	printf("(3)按位取反操作后为:\n");
	printf("%d\n",~J);

	printf("(4)后置++操作后为:\n");
	printf("m=%d\n",m);
	printf("n=%d\n",n);

	printf("(5)强制类型转换后为:\n");
	printf("%d\n",q);
	printf("%d\n",sizeof(q));

	printf("6.关系操作符\n");

	printf("7.逻辑与操作后为:\n");
	printf("%d\n",w);

	printf("8.条件操作后为:\n");
	printf("%d\n",max);

	printf("9.逗号表达式\n");
	printf("10.下标引用操作符 [],函数调用操作符 () ,结构体 . ->\n");
	printf("11.其它操作符 & *");
	return 0;
}

2.常见关键字

(1)寄存器变量 register

例:register int a = 10;//访问快

(2)有符号数 signed

int 定义的变量是有符号的,int = signed int

无符号数:unsigned int

(3)类型重定义 typedef

例:typedef unsigned int u_int;

unsigned int num = 20;

相当于

u_int num = 20;

(4)static

全局变量 ------> 静态的全局变量

变量

局部变量 ------> 静态的局部变量

static修饰

函数

1.局部变量

例:static int a = 1;

使局部变量的生命周期变长,可以保存上一次的值。

2.全局变量和函数

static修饰全局变量,使得extern失去作用效果。改变其作用域,使其只能在自己的所在源文件内部使用。

static修饰函数,使得extern失去作用效果。改变其链接属性,由外部的链接属性变为内部的链接,使其只能在自己的所在源文件内部使用。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//static修饰局部变量
void test ()
{
	static int a = 1;
	a++;
	printf("a=%d\n",a);
}
int main()
{	
	int i = 0;
	while (i<5)
	{
		test();
		i++;
	}
	return 0;
}

(5)#define定义常量和宏

1.#define定义标识符常量

例:#define MAX 100

2.#define定义宏(带参数)

例:#define MAX (x,y) (x>y?x:y)(无参数类型) 宏模块之间不能有空格

调用:

max = MAX(a,b)

定义了一个MAX(x,y)的宏

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//#define定义宏
#define MAX(x,y)(x>y?x:y)
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	printf("a=");
	scanf("%d",&a);
	printf("b=");
	scanf("%d",&b);
	c = MAX(a,b);
	printf("最大值是:%d\n",c);
	return 0;
}

3.指针

(1)产生地址

用地址访问内存,如何产生地址?

例:

32位计算机,32根地址线/数据线(正/负),产生个地址,0~

每个地址用32个bit位 = 4byte表示,由计算机设计原理,1个内存单元的大小是1个byte。

所以32位系统最多只能支持4GB内存条


内存就是房间 地址(指针)就是房间号

内存的大小就是房间的大小,地址的大小就是房间号的大小,地址的数量,就是房间的数量,就是内存的数量。

(2)指针变量

指针变量是用来存放地址的

例:int a = 10;

int* p = &a;

int*是p的数据类型

p是指针变量

p里面存放的是a的地址,%p以地址类型打印。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//指针变量
int main()
{
	int a = 10;
	int* p = &a;
	printf("a的地址是:%p\n",p);

	printf("a=%d\n",*p);
	*p = 20;
	printf("a=%d\n",*p);
	return 0;
}

(3)解引用操作 *

*p = 20;(通过对a的地址解引用来修改a的值)

地址:p &a

内容:*p a

(4)指针变量的大小

指针(地址)大小,在32位平台是4byte,32bit,在64位平台是8byte,64bit。

例:a为int型,占4个字节,占4个内存单元,所以占4个地址,但计算机制只读首地址,4个地址是连续的,而且地址是动态变化的。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//指针变量的大小
int main()
{
	printf("%d\n",sizeof(char*));
	printf("%d\n",sizeof(short*));
	printf("%d\n",sizeof(int*));
	printf("%d\n",sizeof(double*));
	return 0;
}

4.VS 32转64

(1)Debug -> 配置管理器...

(2)活动解决方案 -> <新建...>

(3)选择x64

(4)win32 <-> x64 切换

5.思维导图

相关推荐
爱吃西瓜的小菜鸡2 小时前
【C语言】判断回文
c语言·学习·算法
FeboReigns5 小时前
C++简明教程(文章要求学过一点C语言)(1)
c语言·开发语言·c++
FeboReigns5 小时前
C++简明教程(文章要求学过一点C语言)(2)
c语言·开发语言·c++
_小柏_5 小时前
C/C++基础知识复习(43)
c语言·开发语言·c++
yoyobravery6 小时前
c语言大一期末复习
c语言·开发语言·算法
落羽的落羽10 小时前
【落羽的落羽 C语言篇】自定义类型——结构体
c语言
Kisorge10 小时前
【C语言】代码BUG排查方式
c语言·开发语言·bug
yoyo勰11 小时前
sqlite3
c语言·sqlite
就爱学编程12 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(上)
c语言·数据结构
意疏12 小时前
【C 语言指针篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章
c语言·开发语言·指针