Day2
C 语言编程基础
终端默认为行缓冲 I/O 方式,在调用 scanf 函数输入数据时,只有按下回车键(即输入了换行符)系统会将你输入的数据提交给程序进行处理,并且所有输入的数据都会进入输入缓冲区(系统维护的一块内存空间)中暂存起来,scanf 函数从输入缓冲区的最前面提取它期望类型的数据,剩余的数据依旧保存在输入缓冲区中,后面调用 scanf 函数可以接着提取数据。如果调用 scanf 函数时输入缓冲区中没有任何数据,scanf 函数会等待用户按键输入,但如果输入缓冲区中有数据,并且数据不是 scanf 期望的数据,scanf 函数会立即失败返回。如果程序结束,输入缓冲区就会被释放。
在使用行缓冲机制时,printf 函数并不是将数据直接输出到终端显示,而是将数据传送到输出缓冲区中暂存起来,当换行符进入输出缓冲区或输出缓冲区满了或程序正常结束时,系统会将输出缓冲区中的当前所有数据都一起推送到终端显示。
I/O:Input/Output,输入/输出。
C 语言主要内容:
- 基本数据类型
- 变量、常量
- 运算符、表达式
- 流程控制结构(顺序结构、选择结构、循环结构)
- 函数
- 复杂数据类型(数组、指针、结构体、共用体、枚举)
常量(Constant)
值不可改变的量就是常量。
常用的三种常量:
- 字面量
- 使用 const 关键字定义的常量(也称为常变量,只读变量)
- 宏(使用 #define 定义)
整数字面量写法形式:
- 123:int 类型,十进制形式
- 123L:L 也可以小写,long 类型,十进制形式
- 123U:U 也可以小写,unsigned int 类型,十进制形式
- 0123L:long 类型,八进制形式
- 0x123:int 类型,十六进制形式
int main()
{
int i = 123;
i = 0123; // 八进制形式
i = 0x123; // 十六进制形式
i = 0b101; // 二进制形式,某些编译器不支持
printf("%d\n",i); // %d 表示十进制形式的 int 类型数据
printf("%o\n",i); // %d 表示八进制形式的 int 类型数据
printf("%x\n",i); // %d 表示十六进制形式的 int 类型数据
return 0;
}
浮点数字面量写法形式:
- 十进制小数写法,例如:3.14、-5.12321、.456 等
- 科学计数法写法,例如:1.24e3、-5.8E-3、9.123e-9 等
注意:上面两种写法形式都可以加上后缀F(或f),表示为 float 类型,否则为 double 类型
int main()
{
long n = 123;
n = 123L;
n = 0x123L;
n = 123;
printf("%lu %lu\n",sizeof(3.14F),sizeof(3.14));
return 0;
}
字符型字面量:用单引号将一个英文字符括起来,比如:‘a’、‘,’、‘\n’、’ ‘、’\0’、‘5’、‘\’’ 等
字符串字面量:用双引号将 0 个或多个任意字符括起来,比如:“”(空字符串)、“hello,china”、“a”、“你好”、“hello\nchina” 等
使用 const 关键字可以定义常量。语法规则如下:
// 举例如下
const double PI = 3.14159; // double const PI = 3.14159; 这两种写法等效
const int MAX_DEVICE_CNT = 255;
常量名的命名规则和变量一样,推荐的常量命名风格:由一个或多个有意义的单词构成,单词之间用下划线分隔,所有字母大写。
预处理命令:也称为预编译命令,以 # 开头的行就是预处理命令,比如:
#include <stdio.h> // 头文件包含预处理命令
#define PI 3.14 // 宏定义预处理命令,定义一个宏,宏名为PI,其值固定为 3.14,下面代码中不能改变其值
宏:macro
宏定义在实例开发中具有“一改全改”的效果,非常有利于代码的维护。
运算符(Operator)
实现运算功能的各种特殊符号,也称为操作符,不如:+、-、*、/、%、&、||、>、== 等。
C 语言支持非常丰富的各种运算符,借助它们就能实现各种数据处理操作。
操作数(Operand):参与运算的数据。
运算符就是对它的操作进行运算,得到一个结果数据。
根据运算符所支持的操作数个数不同,运算符可以分为三类:
- 单目运算符(一元运算符):
- 双目运算符(二元运算符):
- 三目运算符(三元运算符):只有一个,即条件运算符(?😃
根据运算功能进行分类:
- 算术运算符:+(加法运算符)、-(减法运算符)、*(乘法运算符)、/(除法运算符)、%(模运算符或取余运算符)、-(负号运算符)、++(自增运算符)、–(自减运算符)
- 比较运算符:运算结果为布尔值(真True或假False),有:>、>=、<、<=、==、!=
#include <stdio.h>
int main()
{
int a;
a = 1 < 2;
printf("%d\n",a); // 真为1 假为0
a = 2 == 3;
printf("%d\n",a);
return 0;
}
/*
输出:
1
0
*/
- 逻辑运算符:运算结果也是布尔值(真True或假False),其操作数也要求为布尔值,如果不是布尔值,会先自动转换为布尔值在进行运算,转换规则为:非零值为真,零转为假。有:!(逻辑非运算符,单目)、&&(逻辑与运算符,双目)、||(逻辑或运算符,双目)
#include <stdio.h>
int main()
{
int b;
scanf("%d",&b);
b = 3 < b < 8; // 恒为真
printf("%d\n",b); // 真为1 假为0
return 0;
}
/*
输出:
1
*/
- 位运算符:针对操作数的二进制位进行运算处理,切记:只有整数类型才支持位运算符,浮点数不支持。有:~(按位取反运算符)、&(按位与运算符)、|(按位或运算符)、^(按位异或运算符)、<<(按位左移运算符)、>>(按位右移运算符)。
- 赋值运算符:运算结果为被赋值的数据,另外它具有一个运算效果,即将其左操作数的值修改为右操作数,所以其左操作数必须为变量。有:=、复合赋值运算符(+=、-=、*=、/=、!=、%=、&&=、||=)
- 特殊运算符:条件运算符(?😃,逗号运算符(,)
模运算符(%)的运算结果的符号由它的左操作数决定,与右操作数的符号无关。
自增/自减运算符有两种用法形式:前置自增/自减运算符、后置自增/自减运算符。区分方法:运算符写在操作数左边就是前置,写在操作数右边就是后置。前置和后置的运算效果是一样的,都会使操作数的值自增一或自减一,所以其操作数必须为变量。它们的区别只是运算结果不同,后置的运算结果为操作数的原值,前置的运算结果为操作数加一或减一之后的值。
#include <stdio.h>
int main()
{
int a = 3;
int b = 4;
a++;
++b;
c = a++ + 2;
d = 3 - ++b;
printf("a = %d,b = %d\n",a,b);
printf("c = %d,d = %d\n",c,d);
return 0;
}
/*
输出结果:
a = 5,b = 6
c = 6,b = -3
*/
逻辑非运算特性:如果操作数为真,运算结果就为假,否则运算结果就为真。
逻辑与运算符特性:有“并且”之意,只有当它的两个操作数都为真时运算结果才为真,否则结果为假。
逻辑或运算符特性:有“或者”之意,只有当它的两个操作数都为假时才为假,否则结果为真。
逻辑与和逻辑或运算符具有“短路”效果。
#include <stdio.h>
int main()
{
int a = 1,b = 2, c = 3;
c = a < 2 || b++;
printf("a = %d,b = %d,c = %d\n",a,b,c);
return 0;
}
/*
输出结果:
a = 1,b = 2,c = 1
*/
运算符的运算结果是一个常量性质的临时数据,不能被赋值
条件运算符的运算特性:操作数1 ? 操作数2 :操作数3,首先会计算操作数1,如果其值为真或非零,就接着计算操作数2,并且将操作数2的值作为最终运算结果,操作数3直接忽略。如果操作数的1的值为假或零,就接着计算操作数3,并且将操作数3的值作为最终运算结果,操作数2直接忽略。
#include <stdio.h>
int main()
{
int a = 4,b = 2, c = 3;
c = a < 9 ? b++ : (a += 9);
printf("a = %d,b = %d,c = %d\n",a,b,c);
return 0;
}
/*
输出结果:
a = 4,b = 3,c = 2
*/
逗号运算符(,):优先级最低,双目运算符,左结合性,运算特性为:先计算左操作数,然后计算右操作数,并且将右操作数的值作为最终运算结果。
#include <stdio.h>
int main()
{
int a = 6,b = 3, c = 2,d;
d = (a = 3, b++,c -= 2);
printf("a = %d,b = %d,c = %d,d = %d\n",a,b,c,d);
return 0;
}
/*
输出结果:
a = 3,b = 4,c = 0,d = 0
*/
运算符有两个重要的属性:
- 优先级:优先级高的运算符先运算,优先级低的运算符后运算
- 结合方向:有两种结合防线,从左向右、从右向左。
小括号也可以看成运算符,它的优先级最高

学习方法:对于这张表不需要完全背下来,只需要记住下面总结的几点就够用了:
- 最低的三个:逗号运算符最低,其次是赋值运算符,条件运算符是 C 语言中唯一的三目运算符,它的优先级正好是倒数第三
- 括号优先级最高,所以以后在实际开发中,如果拿不准运算符的优先级,就多加括号控制运算顺序,千万不要想当然乱猜!
- 单目运算符比双目运算符优先级高
- 逻辑运算符的优先级各不一样,记住三个字:非与或
- 在双目运算符中,优先级存在这个规律:算术运算符>比较运算符>逻辑运算符
表达式(Expression):由变量、常量、运算符、函数调用等构成的式子,注意:单个变量、单个常量、单个函数调用也是表达式,比如:1+2、i/3+j、get_count()+5、
常用进制转换
常用进制:
- 二进制:Binary,BIN
- 八进制:Octal,OCT
- 十进制:Decimal,DEC
- 十六进制:Hexadecimal,HEX

904

被折叠的 条评论
为什么被折叠?



