一些关键字:
extern:表示声明。 没有内存空间。 不能提升。
const:限定一个变量为只读变量。
volatile: 防止编译器优化代码。 volatile int flg = 0;
register: 一般在编写底层的时候,应用开发使用很少。定义一个寄存器变量。没有内存地址。 register int a = 10; // 把数直接存到寄存器里面
字符串:
C语言中,用双引号引着的一串字符,称之为字符串。一定有一个结束标记’\0'
char ch = ‘A’;
一个字节
"abc" --> 'a''b''c''\0'
‘a’
不等价 “a”('a''\0')
左边是字符,右边是字符串
输入输出函数
1.scanf函数:
从键盘接收用户输入。
(1) 接收 整数 %d
int a, b, c; 创建变量空间, 等待接收用户输入。
scanf("%d %d %d", &a, &b, &c);
(2) 接收 字符 %c
char a, b, c;
scanf("%c %c %c", &a, &b, &c);
(3) 接收 字符串 %s
char str[10]; // 定义一个数组,用来接收用户输入的 字符串。中括号内必须填写数字,才能告诉字符串如何开辟大小
scanf("%s", str); // 变量名要取地址传递给 scanf, 数组名本身表示地址,不用 & 符。
【注意】
1) scanf 具有安全隐患。如果存储空间不足,数据能存储到内存中,但不被保护。【空间不足不要使用】
2) scanf 函数接收字符串时, 碰到 空格 和 换行 会自动终止。不能使用 scanf 的 %s 接收带有空格的字符串。
例:当输入"hello world"时,会输出"hello"
将 #define _CRT_SECURE_NO_WARNINGS 添加到程序 第一行。 解决scanf 4996错误
2.printf函数:
char ch = 'a'; //字符
char str[] = "hello world"; // 数组,一个11位
printf("ch = %c\n", ch); // c是字符
printf("str = %s\n", str); // s是字符串
char str2[2] = { 'h','e' }; // 这个后面没有‘\0’,打印完he之后就会一直打印直至出现\0截至,就会出现乱码
printf("str2 = %s\n", str2); // he烫烫烫烫烫烫烫烫烫烫烫烫烫i谍\p
char str1[3] = { 'h','e','\0' }; // 这里有'\0',打印到'\0'截止,所以输出是he
printf("str1 = %s\n", str1); // he
%s | 打印字符串, 挨着从字符串的第一个字符开始打印,打印到’\0’结束。 |
%d | 打印整数 |
%c | 打印字符 |
%x | 打印16进制数 |
%u | 打印无符号 |
%m.n: | 打印实型时用到,一共有 m 位(整数、小数、小数点),n位小数。 |
%0m.nf: | 其中 f:表示打印实型,一共有 m 位(整数、小数、小数点),n位小数。 0:表示不足 m 位时,用0凑够m位。 |
%% | 显示一个%。 转义字符’’ 对 % 转义无效。 |
%Ns | 显示N个字符的字符串。不足N用空格向左填充。 |
%0Ns | 显示N个字符的字符串。不足N用0向左填充。 |
%-Ns | 显示N个字符的字符串。不足N用空格向右填充。 |
3.putchar函数:
输出一个 字符 到屏幕。
直接使用 ASCII 码。
不能输出字符串。
‘abc’
既不是一个有效字符,也不是一个有效字符串。 有效字符‘a’
,有效字符串“abc”
常用putchar('\n')
;来打印换行。
printf("\n");
也可以打印换行
4.getchar()函数:
从键盘获取用户输入的 一个字符。
返回该获取的字符的 ASCII 码。
算数运算符:
先 * / % 后 + -
除法运算后,得到的结果赋值给整型变量时,取整数部分。
除0 :错误操作。不允许。
对0取余:错误操作。不允许。
不允许对小数取余。余数不能是 小数。 35 % 3.4;
对负数取余,结果为余数的绝对值。10 % -3; --》 1
++ 和 --:后缀优先级高于前缀
前缀自增、自减:先自增/自减, 在取值。
int a = 10;
++a; // a = a+1;
后缀自增、自减: 先取值, 再自增/自减。
int a = 10;
a++; // a = a+1;
// a = 10,b=20
printf("a = %d", a++); // 先取值给%d,再自增 10
printf("a = %d", a); //11
printf("b = %d", ++b); // 先自增,再取值给%d 21
printf("b = %d", b); // 21
赋值运算:
int a = 5;
a += 10; // a = a+10;
a -= 30; // a = a-30;
a %= 5; // a = a % 5;
比较运算符:
== 判等。
!= 不等于.
< 小于
<= 小于等于
> 大于
>= 大于等于
13 < var < 16 (计算机中不允许); ==> var > 13 && var < 16;
逻辑运算符:
0为假,非0为真。(1)
逻辑非:! 非真为假, 非假为真。
int a = 10;
int b = 0;
printf("!a = %d", !a); // 0
printf("!b = %d", !b); // 1
逻辑与: &&(并且) 同真为真,其余为假。
逻辑或:|| (或) 有真为真。同假为假。
int a = 10;
int b = 0;
printf("%d", a && b); // 不同时为真,所以结果是假
printf("%d", a || b); // 有一个为真,结果为真
三目运算符: ? :
表达式1 ? 表达式2 : 表达式3
表达式1 是一个判别表达式。 如果为真。整个三目运算,取值表达式2。 如果为假。整个三目运算,取值表达式3。
默认结合性。自右向左。
逗号运算符
int a=10, b=20, c=30;
int x = (a = 1, b = 2, c = 5); // “,”运算过程是从左到右,x的值不断被覆盖,“,”运算优先级别最低
printf("x = %d\n", x); //5
printf("a = %d\n", a); //1
printf("b = %d\n", b); //2
printf("c = %d\n", c); //5
运算符优先级:
[]() > ++ -- (后缀高于前缀) (强转) sizeof > 算数运算(先乘除取余,后加减)> 比较运算 > 逻辑运算 > 三目运算(条件运算)> 赋值运算 > 逗号运算
类型转换:
隐式类型转换: 由编译器自动完成。
由赋值产生的类型转换。 小–》大 没问题。 大 --》 小 有可能发生数据丢失。
int r = 3;
float s = 3.14 * r * r; // 得到的结构是double(编译器自动完成),但是最后赋值给了float,完成了一种赋值类型转换
```
```c
int a = 321;
char ch = a;
printf("ch=%d\n", ch); // char=65
256 128 64 32 16 8 4 2 1
321: 1 0 1 0 0 0 0 0 1 9位
char ch = 0 1 0 0 0 0 0 1 8位
强制类型转换:
语法: (目标类型)带转换变量 或 (目标类型)带转换表达式
float price = 3.6;
int weight = 4;
double sum = price * weight;
double sum2 = (int)price * weight;
printf("价格:%f\n", sum); // 14.400000
printf("sum1:%d\n", (int)sum); // 这里的Int一定要带括号,不然会报错 sum1:14
printf("价格:%f\n", sum2); // 价格:12.000000,这里只是转price,因为()的优先级高于*
大多数用于函数调用期间,实参给形参传值。