1、输入输出函数
1.1 printf()
printf( " 格式符 + 转义字符 ",输出表像);
- 函数原型
int printf(const char *format, ...);
- 作用:将双引号中的内容原封不动输出
1.2 格式符
格式符 | 作用 |
---|---|
%d | 十进制输出有符号数 |
%ld | 十进制输出有符号长整型 |
%f | 输出float类型 |
%lf | 输出double类型 |
%c | 输出字符类型 |
%s | 输出字符串 |
%u | 无符号输出整型的十进制 |
%#X/x | 输出十六进制 |
%#o | 输出八进制 |
%.nf | 输出小数点后n位 |
%nd | 以n个数据宽度靠右对齐输出 |
%-nd | 以n个数据宽度靠左对齐输出 |
%p | 输出内存地址 |
1.3 转义字符
转义字符 | 含义 |
---|---|
\n | 换行 |
\t | 制表符 |
\r | 回车 |
\b | 退格 |
1.4 scanf()
scanf()
获取数据时,以空格、tab键和回车作为数据之间的分隔- 回车在缓冲区内数据个数大于等于格式符个数时,回车是结束的标志
- 函数原型
int scanf( const char *format, ...);
- 用法
scanf( " 格式符", 变量地址);
注意事项
- 逗号后面的内容,是变量的地址
scanf
的双引号内不要加**\n**scanf
是严格控制格式的函数,终端输入的格式要和双引号内的格式一致
1.5 getchar()
- 在使用
scanf()
连续输入字符时会产生垃圾字符 - 合理利用
getchar()
可以吸收垃圾字符 - 函数原型
int getchar(void);
- 返回值:字符的ASCII码
- 参数:void
- 功能:从终端获取单个字符,并返回该字符的ASCII码
1.6 putchar()
- 单个字符的输出函数
- 函数原型
int putchar(int c);
- 返回值:int
- 参数:
int c //要输出的字符的ASCII码
- 功能:输出单个字符
putchar(10);
输出 \n 换行
2、运算符
2.1 算术运算符
运算符 | 格式 | 功能 |
---|---|---|
+、-、* | a +/-/* b | 两数相加、相减、相乘 |
/ | a / b | 如果运算符两侧的操作都为整型,就取整操作;如果运算符两侧有一个操作数是浮点型,结果就是整除 |
% | a % b | 取a除b的余数部分;要求两个操作数都是整形 |
2.2 赋值运算符
运算符 | 格式 | 功能 |
---|---|---|
= | a = b | 把b的值赋给a |
+= | a += b | a = a + b,把a+b的结果赋值给a |
-= | a -= b | a = a - b |
*= | a *= b | a = a * b |
2.3 自增自减运算符
- ++和–操作符对应两条汇编指令
- 前置
- 变量自增(减)1
- 取变量值
- 后置
- 取变量值
- 变量自增(减)1
- 前置
- C语言中只规定了++和–对应指令的相对执行次序
- ++和–对应的汇编指令不一定连续运行
- 在混合运算中,++和–的汇编指令可能被打断执行
- ++和–参与混合运算结果是不确定的
2.3.1 小结
- ++和–操作符在混合运算中的行为可能不同
- 编译器通过贪心法处理表达式中的子表达式
- 空格可以作为C语言中一个完整符号的休止符
- 编译器读入空格后立即对之前读入的符号进行处理
2.4 关系运算符
- 关系运算的结果,非真即假,非0即1
运算符 | 格式 | 功能 |
---|---|---|
== | a == b | 判断两数是否相等 |
!= | a != b | 判断两数是否不相等 |
“>”“>=” | a > / >=b | 判断a是否大于b/a是否大于等于b |
“<”“<=” | a < / <= b | 与上述相反 |
2.5 逻辑运算符
-
逻辑运算的结果,非真即假,非0即1
-
==||==从左向右开始计算
- 当遇到为真的条件时停止计算,整个表达式为真
- 所有条件为假时表达式才为假
-
==&&==从左向右开始计算
- 当遇到为假的条件时停止计算,整个表达式为假
- 所有条件为真时表达式才为真
-
逻辑表达式中,==&&比||==具有更高的优先级
- 在==&&和||混合运算时,整个表达式被看作||表达式,编译器从左向右开始计算&&表达式,当某个&&==表达式的值为真时,停止计算,整个表达式的值为真。
++i || ++j && ++k
(true && ++i) || (++j && ++k)
i = 1 j = 0 k = 0
2.6 三目运算符
-
三目运算符( a ? b : c )可以作为逻辑运算的载体
- 规则:当a的值为真时,返回b的值;否则返回c的值
-
当三目运算符作为左值时
*(a < b ? &a : &b) = 3
- 三目运算符返回的是一个值
- 通过指针*可以通过地址对三目运算符返回的值进行修改
-
三目运算符(a ? b : c)的返回类型
- 通过隐式内陆转换规则返回b和c中较高的类型
- 当b和c不能隐式转换到同一类型时编译出错
2.7 逗号运算符
- 逗号表达式是C语言中的**“粘贴剂”**
- 逗号表达式用于将多个子表达式连接为一个表达式
- 逗号表达式的值为最后一个子表达式的值
- 逗号表达式中的前 N - 1个子表达式可以没有返回值
- 逗号表达式按照从左向右的顺序计算每个子表达式的值
2.8 sizeof()
-
sizeof是编译器的内置指示符
-
sizeof用于计算类型或变量所占的内存大小
- sizeof用于类型
sizeof(type)
- sizeof用于变量
sizeof(var)
或sizeof var
- sizeof用于类型
-
sizeof的值在编译期就已经确定
-
sizeof是C语言的内置关键字而不是函数
- 在编译过程中所有的sizeof将被具体的数值所替换
- 程序的执行过程与sizeof没有任何关系
2.9 位运算符
- 位运算符直接对bit位进行操作,其效率最高
位运算符 | 作用 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
例如:
将data的[7:4]位置1
data | (-128 >> 3);
2.9.1 左移和右移的注意点
- 左操作数必须为整数类型
- char和short被隐式转换为int后进行移位操作
- 右操作数的范围必须为:[0,31]
- 左移运算符==<<==将运算数的二进制位左移
- 规则:高位丢弃,低位补0
- 右移运算符==>>==把运算数的二进制右移
- 规则:高位补符号位,低位丢弃
位运算的口诀:
- 0与任何数都是0,与运算用于给某一位置0
- 1或任何数都是1,或运算用于给某一位置1
- 0异或任何数都数本身,1异或任何数都是取反
左移n位相当于乘以2的n次方
右移n位相当于除以2的n次方
2.9.2 运用位运算实现数字交换
#define SWAP(a,b) \
{ \
a = a ^ b; \
b = a ^ b; \
a = a ^ b; \
}