C语言基础
基本数据类型与输入输出
变量的定义
int a ; // int整形 程序执行这句语句的时候,系统会在存在中开辟一个大小的为4个字节的空间,用于存放一个整数;
这个内存空间表示的值就是变量a的值,这里的a为变量名;
变量名有子母,数字、下划线组成,其中数字不能作为变量名的开头。
char c; 程序执行这句语句的时候,系统会在存储中开辟一个大小为1个字节的空间,用来存放一个字符;
这里的字符指的是英文字符,中文是无法用一个字节去存储的。
输入输出
输入处处函数的声明都包含在<stdio.h>文件中
scanf("%d", &a); //从键盘缓冲区中读取一个整数,存入变量a中,(&a表明存储的位置)
这里&符号为取地址运算符。
printf("%d", a); //打印出a的值,这里的a为整数类型
printf(“Hello World”);
scanf("%d %d", &a, &b); //从键盘缓冲区中读取两个整数,存入变量a,b中;
printf("%d %d", a, b); //打印出a, b的值。
%d整数 decimal
%f浮点数 float
%c字符
有些编译器长整形用%ld来表示;双精度浮点数用%lf来表示。
实例:
ioput.cpp
# include<stdio.h>
int main(){
int a;
float b;
char c;
printf("请输入一个整数,一个浮点数,一个字符: \n");
scanf("%d %f %c", &a, &b, &c); //中间以空格为分割,浮点数默认输出6为小数
printf("a=%d b=%f c=%c", &a, &b, &c);
return 0
}
控制符和转义符
控制符
%d 十进制整数
%o 八进制整数
%x 十六进制整数(a~f小写)
%X 十六进制整数(A~F大写)
%f 浮点数
%e 科学计算表示的浮点数,e小写
%E 科学计算表示的浮点数,E大写
printf("%md"); // m表示输出宽度
printf("%m.nd"); // m表示输出宽度,n表示小数点后的位数
printf("%10d”, 5); //5 默认右对齐
printf("%-10d”, 5); //5 左对齐
printf("%f”, 123.456789); //输出 123.456789
printf("%9.2f”, 123.456789); //输出 123.46
printf("%2.1f”, 123.456789); //输出 123.5 系统忽视设置的输出宽度
printf("%f”, 3/2); // 输出错误
printf("%f”, 3./2); // 输出1.5 整数和整数的运算结果还是整数,浮点数和整数的运算 结果是浮点数
字符0和数值48相等,字符+和43相等,A==65, a == 97
printf("%c”, "0"); // 输出0
printf("%d”, "0"); // 输出48
printf("%c”, 48); // 输出0
printf("%d”, "a"); // 输出97 转义符
printf("\n”); // 输出换行,光标移到下一行
printf("\r”); // 输出回车,光标回到本行的第一个位置,和键盘回车键不同
printf("\t”); //制表符相当于tab键
printf("\b”); // 退格,不删除原来的内容,但之后输出的内容会覆盖原先的内容
printf(""”); // 输出"
printf("\\”); // 输出\
# include<stdio.h>
int main(){
printf("%%"); //输出%
int a = 123;
printf("%d", a);
scanf("\b"); //退格
printf("\n"); // 输出12
return 0
}
运算符的结合性和优先级
强制类型转换
float a=5.2;
printf("%d", a); //输出结果无意义,不可行
printf("%d", int(a)); //输出5,变量a的值依旧是5.2
int b=int(a);
printf("%d", b); //输出结果5
printf("%f", a); //输出结果5.2 自增自减运算符 ++
++a 和a++
int a=0;
printf("%d", ++a); //输出结果1, 相当于a=a+1
int b=0;
printf("%d", b++); //输出结果0
printf("%d", b); //输出结果1
b++
后加运算首先会在内存中存放一个变量b的副本temp,让temp的值等于b的值,然后让b的值加1,最后返回的是t副本temp的值。
逻辑非运算符
在C语言中,非0即真,并且用1来表示真,用0表示假
int a=2;
printf("%d", !a); //输出结果0
printf("%d", !!a); //输出结果1 按位取反运算符
int a=0;
printf("%d", ~a); //输出结果为-1 解析:
0000 0000
1111 1111 补码
1111 1110 反码
1000 0001 原码
sizeof长度运算符
printf("%d", sizeo(int)); //输出结果为4
printf("%d", sizeo(double)); //输出结果为8 结合性
int a=1;
int b=2;
int c=3;
int d=c-a+b;
printf("%d", d); //输出结果为4 (c-a)+b 左结合
c-(a+b)
混合运算
int a=1;
int b=2;
int c=3;
int d=c-a+b;
printf("%d", a+++b); //输出结果为3
(a++)+b; //输出结果为3
a+(++b); //输出结果为4
++a++
(++a)++还是++(a++)
// 后加比前加优先级更高
++a+++b会发生语法错误,默认结合为 ++(a++)+b
(++a)+(++b) 自加运算比加优先级高
自加运算符是右结合的。
自加运算符:后加比前加优先级更高
左移
int a=1;
a=a<<1;
printf("%d", a); //输出2 左移过程解析:
补码: 0000 0001
左移: 0000 0010 ---->2
右移:
int a=9;
a=a>>1;
printf("%d", a); //输出4 右移过程解析:
补码: 0000 1001
右移: 0000 0100 ---->4
在C语言中,没有bool类型,所以用1来表示真,用0来表示假。
printf("%d", 1>2); //输出结果为0
printf("%d", 1==1); //输出结果为1
printf("%d",9!-9); //输出结果为0
printf("%d", 9=9); //发生语法错误 =是赋值,==是等于号。无法给常量进行赋值,可以给变量赋值。
异或:相同为0,不同为1
真与真是真;真与假为假;假与假为假。
实例:
printf("%d", 2>1 ? 5:9); //输出结果为5
printf("%d", 2>5 ? 1:3); //输出结果为3 赋值运算符
实例:
int a=2;
int b=3;
printf("%d", a=b); //输出结果为3
printf("%d", a); //输出结果为3
//赋值运算符的运算`结果等于符号右边的值
int a=1, b=2, c=0;
printf("%d", c=a=b); //右结合c=(a=b);输出2 +=
int a=5;
a+=3; //相当于a=a+3
printf("%d", a); //输出结果8
a*=3 相当于a=a*3
a/=a 相当于a=a/2
实例:
从键盘上输入两个浮点数(均为正数),求出小于这两个浮点数之和中的最大整数
#include <stdio.h>
int main(){
float a, b;
scanf(“%f %f”, &a,&b);
float c=a+b;
printf("%d", (int)c); //强制类型转换,即取出c的整数部分
return 0
}
if else分支和逻辑运算符
if…else…
实例:
从键盘中输入两个整数,输出其中较大的
#include <stdio.h>
int main(){
int a, b;
scanf(“%d %d”, &a,&b);
if(a>b){
printf("%d\n", a);
}else{
printf("%d\n", b);
}
printf("%d\n", a>b?a:b);
a>b? printf("%d\n", a):printf("%d\n",b);
return 0
}
switch case 实现多分支
数组与函数
一维数组
- 数组的概念
如何存储30个同学的成绩?
定义30个变量:score1, score2, …score30
int score[30];
score[0], score[1], score[2], ......, score[29]
- 数组的定义
int a[N];
由于这块空间是在内存中动态的开辟的,所以此时数组a中存放的数据是不定的随机值。 - 数组的小标和使用
- 数组的初始化
二维数组
二维数组定义
int a[2][3]; 系统会在内存中开辟一个大小2*3sizeof(int)个字节的内存空间,和一维数组一样,开辟的是一个线性的空间。
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
同样,由于这块空间是在内存中动态的开辟的,所以数组中的元素的值也都是不定的随机值。
a的数据类型是int[2][3]
初始化
下标
在这里插入代码片 矩阵加
矩阵乘
for(i=0; i<m; i++){
} 高维数组
字符数组
char str[10] = {“o”, “w”, “e”, “q”, “s”, “a”, “b”, “c”, “d”, “e”}
字符数组是一个特殊的一维数组,它的数据类型是字符型
字符数组初始化
char str[10] = {"h", "a", "p", "p", "y"}
char str[10] = {"happy"}
char str[10] = "happy" “h”, “a”, “p”, “p”, “y”, “\0”, “\0”, “\0”, “\0”
字符串以“\0”为结束符号。
我们把字符串常量副值给字符数组时,会自动在字符串后面补“\0”
char str[10] = “happy” ===》 char str[10] = {“h”, “a”, “p”, “p”, “y”, “\0”}
assic码为0的字符恰好就是这个“\0”
字符串的输出和结束标志
scanf("%s", str) str不能有空格的输入,否则输出遇到空格就终止。
gets() 允许有空格的输入
puts()
C 中有大量操作字符串的函数:
头文件 include<string.h>
strcpy(s1, s2); 复制字符串 s2 到字符串 s1,包括s2的结束符。
strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。
strlen(s1); 返回字符串 s1 的长度。s1=“china” len=strlen(s1); len为5
strcmp(s1, s2);按照字典顺序(ASCII码)进行比较:如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
例如:strcmp(“apple”, “banana”) 输出-1,即小于0;strcmp(“apple”, “Banana”) 输出1
5 strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
|