C与C++学习

一、C语言符号: 标识符、关键字、其它符号

1. 注释语句: ///* \dots *///// \dots → 写给人看的

  • C风格: 可多行
  • C++风格: 一行

注释出现位置: 文件头、函数前、重点语句块前

① 作者、版本、程序用途 ② 函数的功能、调用方法以及设计思想 ③ 复杂语句的理解

2. 标识符: 系统预定义标识符、用户自定义标识符

3. 关键字: 不可作为自定义标识符来使用, 共32个

无需记忆, 反复使用。

4. 分隔符: 空格、逗号、分号

  • 函数名后的大括号与函数名: 如 int main(void) 是一个整体, 所以在 int main(void) 后不用加 ;
  • 复合语句标记: {}\{ \dots \} 用于标记函数、语句块

5. 运算符 (=, +, -, *, /, …)

(1) C语言的数据呈现方式: 常数、常量、变量。 原理: 在MEM中分配一块空间来读写数据。 例: int x=3, y=5, z → 数据类型 (int为整型)

变量的使用: z = x + y; ⇒ 先进行相加, 再放入z中。

关于输出格式: printf("%d+%d=%d\n", x, y, z) 输出结果为: 3+5=8 \n 代表输出换行

运算符的结合方式: 从左向右 / 从右向左 (无需记忆, 在使用时查询)

★ 运算符的优先级口诀:

  • 括号成员排第一;
  • 全体单目排第二;
  • 乘除余三, 加减四;
  • 移位五, 关系六;
  • 等于不等排第七;
  • 位与异或和位或, 三分天下“八九十”;
  • 逻辑或跟与, 十二和十一;
  • 条件高于赋值;
  • 逗号运算级最低! 括号一出, 优先争辩。

二、数据类型

  1. 整型变量: int 变量 = ? (变量范围 2312311-2^{31} \sim 2^{31}-1)
  2. 实数变量: float 变量 = ? (变量范围 3.4×10383.4×1038-3.4 \times 10^{38} \sim 3.4 \times 10^{38})
    • 关于是否进行初始化: 即变量之后是否添加“= ?”均可
    • 关于一次定义多个变量: 例如 float fx = 2.0, fy = 5.5, fz;
    • 关于浮点数的输出: 使用 %f, 若要控制小数点位置, 则在 %f 中间加上 .2, .1, .3 等。
  3. 字符变量: char 变量 = '?' (变量范围: 256255-256 \sim 255)

关于字符运算: 遵循 ASCII 码规则, 字符在 ASCII 码表中有对应的数据, 而最终通过数据进行运算并输出结果。 关于字符的输出: 使用 %c, 最终又转换回字符形式 (ASCII)。

* C 语言使用原则:

  • 先定义, 后使用!
  • 给出变量的数据类型之后才能使用!
  • 变量不能重名!
  • 同一类型变量可在同一行代码中定义!
  • 变量一定要初始化才能进行输出!

为什么要定义数据类型? 为了在 MEM 中划分合适的位置来存储数据。

SUMMARY:

  • 基本的数据类型:
    • 字符型 → char → 1 字节
    • 整型 → int → 4 字节
    • 浮点型 → float → 4 字节
    • 双精度型 → double → 8 字节
  • 延伸的数据类型: short int, long int, long double, unsigned int
  • 关于 unsigned: 取消负范围值, 从 0 开始, 长度不变!

构造数据类型: 数组, 结构, 联合, 枚举 指针类型: …

  • scanf_s的使用: scanf_s("数据类型对应占位符", &数据名)

4. 常数

(1) 不建议直接使用常数! (2) 小的解决方法 → 定义宏常量: 在 main 主函数之前 #define 常量名 常量 注意: 宏定义不是语句, 宏定义时不要加 ”;”。 (3) const 常量: 只读常量, 无法被修改! (在 C 语言中, const 只是无法修改的变量) 例: const double PI = 3.14

5. 数值常量

(1) 整型常量 关于三种数制: 十进制 (65)、八进制 (0101)、十六进制 (0x41)、二进制 (0b100001) 长整型: 常量后 + l / L; 无符号整型: 常量后 + u / U; 无符号长整型: + ul / UL

(2) 实数常量 / 浮点数: 只能以十进制数表示 (小数形式或指数形式: 3.14×1033.14 \times 10^{-3} 即 3.14E-3)

(3) 字符常量: 单引号括起来的一个字符, 按 ASCII 表存储, 占一个字节。 (4) 字符串常量: 双引号括起来, MEM 存储时末尾自动加串结束标识符 \0。 (5) 转义字符: 表示字符的一种特殊形式, 表示不可打印字符或具有特殊用途的字符。 (6) 符号常量: 便于可读、调试与修改。

  1. 变量: 在程序执行过程中值可以改变的量。 (1) 变量也必须先定义后使用。 (2) 变量名称一般用小写字母, 不可与关键字重名。 (3) 变量的初始化:
    • 定义时赋值: int num2, num3 = 100;
    • 变量地址: 存放变量的 MEM 中有单元的地址。

三、基本运算

  1. 算术运算 (1) 在算术运算中存在的隐式转换。 (2) 关于取余的符号: %

(3) 算术运算的类型:

  • 双目运算: 即为传统的运算。
  • 单目运算: a++/++a=a+1a++ / ++a = a+1, a/a=a1a-- / --a = a-1, a-a

☆ 关于前置运算和后置运算的区别: 若 x=ii=i1;x=i;x = --i \Rightarrow i = i-1; x = i;x=ix=i;i=i1;x = i-- \Rightarrow x = i; i = i-1;

  1. 赋值运算 (1) 表示形式: <变量> = <表达式>; (2) 本质: 将表达式的值赋给一个变量。 若变量的数据类型与表达式不符, 则自动将右边的数据类型转换成左边变量的类型!

(3) 关于复合运算符: a+=ba=a+ba+=b \Rightarrow a=a+b a=ba=aba-=b \Rightarrow a=a-b 注意: 使用复合运算符时, ”=” 右边的先计算。

  1. 关系运算与逻辑运算 (用于C的控制语句中) (1) 一些关系运算符: ① 大于等于: aba \ge b ② 小于等于: aba \le b ③ 等于: a==ba == b ④ 不等于: aba \neq b 关系表达式值为真, 用1或非零数值表示; 值为假, 用零表示。

2.4.3 关系运算与逻辑运算

关系运算符:a>b (大于), a<b (小于), a==b (等于), a>=b (大于等于), a<=b (小于等于), a!=b (不等于)。 关系表达式的值为 1(真)或 0(假)。

if/else 语句表示方式: if (表达式) printf / xxx ; else printf / xxx ;\boxed{\text{if (表达式) printf / xxx ; else printf / xxx ;}}

(2) 一些逻辑运算符:

① 与: a&&ba \&\& b ② 或: aba || b ③ 非: !a!a

逻辑真为非零, 假为0

3. 位运算

(1) 位逻辑运算:

① 按位与: a&ba \& b a=01,b=10011000a&b=0\boxed{\begin{array}{c} a=01, b=10 \\ \begin{array}{cc} 01 \\ \hline 10 \\ \hline 00 \end{array} \end{array}} \Rightarrow a \& b = 0 ② 按位或: aba | b ab=11a | b = 11

③ 按位异或: aba \oplus b

相同位相同 0\Rightarrow 0 相同位不同 1\Rightarrow 1

a=01b=10a=01 \quad b=10 ab=11a \oplus b = 11 (二进制) 3 (十进制)

④ 按位反: a\sim a

a=01a=10a=01 \Rightarrow \sim a = 10

(2) 右移位运算

格式: 变量名 \gg 右移位数

每右移一位相当于 ÷2\div 2

(3) 左移位运算

格式: 变量名 \ll 左移位数

×2\dots \times 2

4. 其它运算

(1) 三目条件运算

格式: e1?e2:e3e1 ? e2 : e3 \Rightarrowe1e1 为真, 则表达式结果取 e2e2, 否则取 e3e3

例: a>b?a:b;a > b ? a : b ; \Rightarrow 可转化为 if / else

(2) 逗号结合运算

格式: a=25,a/10,a2;a=8a = 2 * 5, a / 10, a - 2; \Rightarrow a = 8

X=(a=10,b=100,c=1000);X=1000X = (a = 10, b = 100, c = 1000); \Rightarrow X = 1000

(3) 长度运算

格式: sizeof(变量名/数据类型)=字节数\text{sizeof}(\text{变量名} / \text{数据类型}) = \text{字节数}

四. 优先级与结合性

分级的原则是:

  1. 单目运算符的优先级高于双目运算符, 双目运算符优先级高于三目运算符。
  2. 在双目运算符中, 算术运算符高于关系运算符, 关系运算符高于逻辑运算符。
  3. 在位运算符中, 移位运算符高于关系运算符, 位逻辑运算符低于关系运算符。
  4. 圆括号运算符优先级最高, 逗号运算符优先级最低。赋值运算符及复合赋值运算符的优先级仅高于逗号运算符。

结合性是指在一个表达式中有多个优先级相同的运算符之间的运算次序。

右结合性 右→左 单目、三目和赋值运算符

左结合性 左→右 其余运算符

表达式与赋值中的自动类型转换

  • 相同类型数据的运算结果, 还是该类型
  • 不同类型数据的运算结果, 是两种类型中取值范围大的那种
    • LONG DOUBLE > DOUBLE > FLOAT > LONG > INT > SHORT > CHAR

表达式与赋值中的自动类型转换

  • 取值范围小的类型赋值给取值范围大的类型是安全的
  • 反之是不安全的
    • 若大类型的值在小类型能容纳的范围之内, 则平安无事
    • 但是浮点数转为整数, 会丢失小数部分, 而非四舍五入
    • 反之转换后的结果必然是错误的, 具体结果与机器和实现方式有关
    • 避免如此使用, 好的编译器会发出警告

自动类型转换与强制类型转换运算符

强转 (Casting) 可以消除从大到小的警告

通过下面方式把表达式的值转为任意类型

(类型)表达式

Example:

int x = 10;
float y;
y = (float)x;

五、输入与输出

1. 格式输出函数 — printf

① 格式: printf("控制字符串", 输出项列表)

包括变量、常量和表达式

② 控制格式说明

控制字符串包括格式控制说明符和普通字符两个部分。

1. 格式控制说明

符号说明
%c按字符输出
%d按十进制整数输出
%u按无符号整数输出
%f按浮点型小数输出
%o按八进制整数输出
%x按十六进制整数输出
%s按字符串输出

③ 修饰符

使用修饰符, 可以控制输出的宽度、精度、小数位数、对齐方式等。

(1) 字段宽度

%6d 表示以字段宽度为6个字节显示一个整数。

设 i=123; printf(” %6d\n” ,i); 输出: __123 printf(” %06d\n” ,i); 输出: 000123 设 x=1234.567 printf(” %.9f\n” ,x); 输出: _1234.567

(2) 负号

不用负号为右对齐, 用负号为左对齐

printf(” %-9.3f\n” ,x); 输出: 1234.567_

(3) 字符*

printf(” %*d\n” ,5,i); 输出: __123 printf(” %*d\n” ,w,i); 输出: 以w宽度显示 printf(” %*.*f\n” ,7,2,x); 输出: 1234.56

2. 普通字符:原样输出的字符

可打印字符 直接写出字符 不可打印字符 使用转义字符\n, \t, \a

例如: m=3; n=12; printf(" num1=%d \t num2=%d\n" ,m,n); 显示: num1=3 num2=12

2.7.3 格式输入函数——scanf

功能: 从键盘输入数据, 按指定的输入格式把数据赋给相应的输入项。 格式: scanf("控制字符串", 输入项列表); 注意: 接收数据的变量必须用其地址表示。

字符输出函数 putchar

功能: 将一个字符输出在显示屏上, 显示参数可以是字符变量、字符常量、字符ASCII码。 putchar( 'A' ); 显示大写字母A putchar(97); 显示小写字母a

输入输出函数被包含在库函数 “stdio.h” 中, 使用这些函数时, 要使用预处理命令: #include <stdio.h>

1. 字符*

输入时, 用于跳过其相应的数据。 scanf(" %d%d" ,&i,&j); 输入 34 45 时, i为34 j为45 scanf(" %*d%d" ,&i,&j); 输入 34 45 时, i为45

2. 空格字符

功能: 输入字符型数据时, 跳过输入流中所有空格字符。 scanf(" %d%d%c" ,&i,&j,&ch); 输入: 45 20 a 时, i为45, j为20, ch为空格

scanf(" %d%d %c" ,&i,&j,&ch);

输入: 45 20 a 时, i为45, j为20, ch为a

3. 可打印字符

功能: 去除输入数据流中与可打印字符相同的字符。

scanf(" %d,%d,%c" ,&i,&j,&ch);

输入应为: 100,200,b (表示以逗号为分隔符)

结果: i为100, j为200, ch为b

2.7.4 字符输入函数——getchar

格式: getchar() 无参数, 只能接收一个字符。

功能: 从键盘上输入一个可打印字符, 函数的返回值为该字符的ASCII码。 使用时, 通常将其返回值赋予某个字符变量或整型变量。

例如:
#include "stdio.h"
main()
{
    char c;
    c=getchar();    putchar(c);
    c=007; putchar(c); putchar(007);
}

程序举例

例: 输入一个0 → 255间的十进制整数, 分别以十六进制数、八进制数、二进制数形式输出该数。

main()
{
    unsigned char i,j;
    printf(" Please input a number less than 256\n" );
    scanf(" %d" ,&i); // 用4个字符宽度输出且不足的用0替换
    printf(" The hexadecimal express of i is 0x%02lx\n" ,i);
    printf(" The octal express of i is %03lo\n" ,i);
    printf(" The binary express of i is %08lo\n" ,i);
}

按16进制输出 → %o: 按8进制输出

④ 二进制的输出: 采用移位运算 + 位与运算

j=(i>>7)+48;
printf(" %1c" ,j);
j=((i>>6)&0x01)+48; // 0的ASCII码值
printf(" %1c" ,j);
j=((i>>5)&0x01)+48;
printf(" %1c" ,j);
j=((i>>4)&0x01)+48;
printf(" %1c" ,j);
j=((i>>3)&0x01)+48;
printf(" %1c" ,j);
j=((i>>2)&0x01)+48;
printf(" %1c" ,j);
j=((i>>1)&0x01)+48;
printf(" %1c" ,j);
j=((i&0x01)+48);
printf(" %1cn" ,j);

Linked Notes

No outgoing note links.

Referenced By

No backlinks yet.