C基础(学习笔记)

本文详细介绍了C语言的基础知识,包括变量、数据类型、控制流、数组、函数、字符串和指针等内容。强调了指针的重要性和用法,如指针的赋值、运算、作为参数传递以及与数组的关系。此外,还提到了结构体和变量的作用域与生存期,为深入学习C语言打下坚实基础。
摘要由CSDN通过智能技术生成

第一章:变量和常亮

1. 变量名

注意不要取名为 begin 、 end 、 next 、 index、 list、 link 等

2. 基本数据类型

int和long区别如下:
32位系统:long是4字节32位,int是4字节32位。
64位系统:long是8字节64位,int是4字节32位。
在这里插入图片描述注:
1. float的精度是保证至少7位有效数字是准确的
2. C++代码中将数字赋值给float变量,如果给出警告warning C4305: “=”: 从“int”到“float”截断,则超出了float的精度范围,在我的测试中赋值为16777216及以下整数没有警告,赋值为16777217时给出了警告。

3. 数据类型转换

整型数据也可以转换为字符型数据,但只会留下最右边的一个字节(第0位 到第7位),其他字节丢弃

  char a= 334; 
  cout << a<<",";//直留下最右边的一个字节,即334-256=78,或者说只留下16进制表示的后两位所表示的数值 
  int b = a;
  cout << b;
	输出结果:N,78

4. 转义字符

\n, \\, \0, \’, \"。

第二章

1. 输入输出控制符

用scanf可以一次读入多个类型不同的变量,只要输入的各项之间用空格分隔即可。

  • 输入字符时,不会跳过空格(空格也会被当作字符读入), 输入其他类型的数据时,会跳过空格
  • 如果在输入中有scanf中出现的非控制字符,则这些字符会被跳过,但要在输入框里对应非控制字符。
int n,m; char c; float f;
scanf("%d %c,%f:%d",&n,&c,&f,&m);
printf("%d,%c,%f,%d",n,c,f,m);
return 0;

输入:12 k,3.75:290【Enter】
输出:12,k,3.750000,290

2. 控制printf 输出整数的宽度

%nd(如%4d,%12d) 以n字符宽度输出整数, 宽度不足时用空格填充。
%0nd(如%04d,%012d) 以n字符宽度输出整数, 宽度不足时用0填充。
%.nf(如%.4f,%.3f) 输出浮点数, 精确到小数点后n位

3. printf 中的格式控制符

%x: 以十六进制形式读入或输出 int整数

  • 0x… 表示输入形式代表输入的是16进制数整形,用以区别于十进制
printf("%x,%d,%u",0x17, 0xffffffff,0xffffffff);
输出 => 11,-1,4294967295
  • %u: 以无符号整数形式输出整数

举例:

int n,m; 
scanf("%d %u",&n,&m ); //读取之后m内保存的还是-1,但是输出的时候自动以无符号数的形式输出 
printf("%d  %u",n,m);
输入:1 -1
输出:1  4294967295(-1的补码,以无符号数的形式输出)
int n,m; 
scanf("%d %d",&n,&m );
printf("%d  %u",n,m);
输入:1 -1
输出:1  4294967295(-1的补码,以无符号数的形式输出)

4. 表达式的精度

a+b、 a-b、 a*b、 a/b这四个表达式的值,就是a和b做算术运算的结果。表达式的值的类型,以操作数中精度高的类型为准。
精度:double > long long > int > short > char

5. 溢出

两个整数类型进行加、减、乘都可能导致计算结果超出了结果类型所能表示的范围,这种情况就叫做溢出。溢出部分直接被丢弃。

#include<iostream> 
using namespace std;
int main() {
     
    unsigned int a ;
    cin >> a;        //此处输入4294967298
    cout << a<<endl;         //输出为4294967295
    
    unsigned int b = 4294967298; 
    cout << b;        //输出为2
    return 0;
}

6. 自增自减运算

++a ,–a 则返回值为加减之后的值,a++ ,a–在后则返回值为操作前的值,但是操作结束之后a的值总是有相应的变化。

7. 逻辑表达式

逻辑表达式是短路计算的,即对逻辑表达式的计算,在整个表
达式的值已经能够断定的时候即会停止

  • exp1 && exp2 : 如果已经算出表达式exp1为假,那么整个表达式的值肯定为假,于是表达式exp2就不需要再计算
  • exp1 || exp2 : 如果已经算出exp1为真,那么整个表达式必定为真,于是exp2也不必计算
  • 所以在写代码的时候,判定里面最好不要有自增自减运算,因为不能确定所有逻辑表达式是否能被执行****
    int a = 0, b = 2;
	int n = a++ && ++b;
	cout << n << "," << a << "," << b;
输出结果为:0,1,2

8. scanf 和cin 输入数据

  • cin >> m >> n … 表达式的值,在成功读入所有变量时为true,否则为false
   int n,m;
   freopen("c:\\Users\\Administrator\\Downloads\\...txt", "r", stdin);
   while(cin >> n >> m ) {
   
   printf("%d",n+m);
}

注: Ctrl+Z 然后 回车,程序结束

  • 用cin读入所有输入的字符, 包括空格,回车:
   #include <iostream>
using namespace std;
int main()
{
   
	freopen("c:\\Users\\Administrator\\Downloads\\11.txt", "r", stdin);
	int c;
	while ((c = cin.get()) != EOF) {
   
	%while( cin >> n)    //读取的过程中,cin.get()的返回值一直是int类型的非负数,直到读取结束时,返回-1,即EOF%
		cout << (char)c;
	}
	return 0;
} 
  • scanf()表达式的值:
    scanf(…)表达式的值为int,表示成功读入的变量个数。
   int n,m;
   freopen("c:\\Users\\Administrator\\Downloads\\...txt", "r", stdin);
   printf("%d",scanf("%d%d",&n,&m));  
  • 用scanf读入所有输入的字符,包括空格,回车
   char c;
   freopen("c:\\Users\\Administrator\\Downloads\\...txt", "r", stdin);
   while(scanf("%c",&c) != EOF) {
   
   // 或 while(scanf("%d",&n) == 1) %
   //每次读取了几项,scanf的返回值就是多少,此处每次都读取一项,故scanf()=1,直到数据读取结束时,scanf()返回-1  
   printf("%c",c);
}
   int n,m;
   freopen("c:\\Users\\Administrator\\Downloads\\...txt", "r", stdin);
   while(scanf("%d%d",&n,&m) == 2) {
   
   printf("%d",n+m);
}

注:直到输入 Ctrl+Z 然后 回车,程序结束
注:读取文件数据时,读取结束的时候,cin或者scanf()会自动返回EOF,即cin>>n 为false,scanf(" ",& ,&…)==EOF, (c = cin.get()) == EOF

  • freopen对于数据的读写
freopen("c:\\Users\\Administrator\\Downloads\\1.txt", "r", stdin);
freopen("c:\\Users\\Administrator\\Downloads\\out1.txt", "w", stdout); 

第三章:条件语句和循环语句

1. switch语句

表达式的值 必须是整数类型(int,char ……)

switch (表达式) {
    //表达式的值 必须是整数类型(int,char ……)
		case 常量表达式1: //常量表达式必须是整数类型的常量(int,char…)
			语句组1
			break;
			case 常量表达式2:
				语句组2
				break;
				……
			case 常量表达式n:
				语句组n
					break;
			default:
				语句组n + 1
  • switch语句在进入某case分支后,会一直执行到第一个碰到的“break;”,即使这个“break;”是在后面的case分支里面。如果没有碰到“break;”,则会向下一直执行到switch语句末尾的“}”,包括“default:”部分的语句组也会被执行。

  • 比如下面的程序n%6=1,则执行case 1:,因为在case 1里不存在break;,所以会一直向后执行,直至遇到break;

 #include <iostream>
using namespace std;
int main() {
   
	int n;
	scanf("%d", &n);
	switch (n % 6) {
   
	case 0:
		printf("case 0");
		break;
	case 1:
		printf("case 1");
	case 2:
	case 3:
		printf("case 2 or 3");
		break;
	case 4:
		printf("case 4");
		break;
	}
	return 0;
}

2. for循环

for循环结构里的“表达式1”和“表达式3”都可以是用逗号连接的若干个表达式

for( int i= 15, j = 0; i > j; i - =2 ,j += 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值