江南才子 发表于 2021-7-11 16:53:11

C语言基础

  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 实现多分支


while循环和do while循环






for循环


continue结束本次循环,break结束整个循环。
数组与函数
一维数组

[*]数组的概念
如何存储30个同学的成绩?
定义30个变量:score1, score2, …score30
int score;
score, score, score, ......, score

[*]数组的定义
int a;

由于这块空间是在内存中动态的开辟的,所以此时数组a中存放的数据是不定的随机值。
[*]数组的小标和使用

[*]数组的初始化




二维数组
  二维数组定义
int a;
  系统会在内存中开辟一个大小2*3sizeof(int)个字节的内存空间,和一维数组一样,开辟的是一个线性的空间。
a a a a a a
同样,由于这块空间是在内存中动态的开辟的,所以数组中的元素的值也都是不定的随机值。
a的数据类型是int
  初始化
  下标
在这里插入代码片
  矩阵加
  矩阵乘
for(i=0; i<m; i++){
}
  高维数组

字符数组
  char str = {“o”, “w”, “e”, “q”, “s”, “a”, “b”, “c”, “d”, “e”}
字符数组是一个特殊的一维数组,它的数据类型是字符型
  字符数组初始化
char str = {"h", "a", "p", "p", "y"}
char str = {"happy"}
char str = "happy"
  “h”, “a”, “p”, “p”, “y”, “\0”, “\0”, “\0”, “\0”
字符串以“\0”为结束符号。
我们把字符串常量副值给字符数组时,会自动在字符串后面补“\0”
char str = “happy” ===》 char str = {“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 的第一次出现的位置。

文档来源:51CTO技术博客https://blog.51cto.com/u_11495341/3036158
页: [1]
查看完整版本: C语言基础