学习
错题
模考
我的
登录/注册/忘记密码
学习 / 顺序结构 / 常见错误
常见错误
语法与语义、分号、中文标点、括号配对
1. 语法错误与语义错误
写程序时会碰到两类「错」。先分清,报错时才知道该改语法还是改思路。 **语法错误(syntax error)** 程序**根本编译不过**,编译器会停下来报错。常见原因: - 语句末尾丢了分号 - 括号、花括号不成对 - 把中文的 `;` `,` `()` 写进了代码 - 关键字拼错,例如把 `int` 写成 `Int` 这类错误发生在「这句话合不合 C 的规矩」。没通过编译,就不会开始运行。 **语义错误(semantic error)** 程序**能编译、能运行**,但结果不是你要的。常见原因: - 公式写错:本该 `a * b`,写成了 `a + b` - 用错变量、用错格式控制符 - 整数除法当成了小数除法(`5 / 2` 得到 `2`) 编译器不管「你是不是这个意思」,只检查「写得像不像 C」。意思错了,要自己对样例、看输出。 | | 语法错误 | 语义错误 | | --- | --- | --- | | 能不能编译 | 不能 | 能 | | 能不能运行 | 不能 | 能(结果可能错) | | 谁先发现 | 编译器 | 你自己(对照题意、样例) | | 例子 | `printf("hi")` 后面没分号 | 求面积写成了周长 | 先让程序能编过,再核对它算得对不对。
2. 丢失分号
C 语言里,**一条语句结束要用英文分号** `;`(ASCII 的 `;`),不是中文的 `;`。 ```c int a = 3; printf("%d", a); return 0; ``` 上面三行末尾都有 `;`。 **最容易漏的位置** - `printf` / `scanf` 后面 - 变量定义、赋值后面:`int n = 1` - `return 0` 后面 **编译器报错行号常常偏到下一行** 漏写分号时,编译器还在「等这句结束」,于是把下一行也拼进来,报错位置可能不是真正漏写的那一行。看到报错时,**先看上一行末尾有没有 `;`**。 ```c int a = 3 /* 这里漏了分号 */ printf("%d", a); /* 报错可能指到这一行 */ ``` 记住:花括号 `{` `}` 那一行**不需要**分号;普通语句需要。
3. 中文标点
输入法停在中文状态时,打出来的标点是**全角字符**,看起来像那么回事,C 编译器却完全不认。 | 你可能打出来的(中文) | 代码里必须用的(英文) | | --- | --- | | `;` | `;` | | `,` | `,` | | `(` `)` | `(` `)` | | `{` `}` | `{` `}` | | `“` `”` 或 `‘` `’` | `"` 和 `'` | ```c /* 错:中文分号、中文括号,编译直接失败 */ printf("%d",a); /* 对:全部是英文标点 */ printf("%d", a); ``` 怎么检查: - 写代码前把输入法切到英文。 - 分号、逗号、括号看起来「偏大、偏宽」,多半是中文的。 - 字符串里面的中文可以有(那是给屏幕看的字);**语法位置上的标点必须是英文**。
4. 括号配对
括号要成对出现,多一个、少一个都会变成语法错误。 **花括号 `{` `}`** - `main` 函数的函数体要用一对花括号包起来。 - 以后写 if、for,也是「左花括号开始、右花括号结束」。 - **漏了**右花括号:编译器常说到文件末尾还在等 `}`,报 `expected declaration` 或 unexpected end of file。 - **多了**右花括号:会在多出来的那一行附近报 expected identifier 之类。 ```c int main() { int a = 1; printf("%d", a); return 0; } /* 和 main 后面的 { 配成一对 */ ``` **圆括号 `(` `)`** - 函数名后面要有:`main()`、`printf(...)`。 - 表达式里用来规定运算顺序:`(a + b) / 2`。 - 左、右个数必须一样,不要把 `(` 和 `{` 混用。 对照着数:从左往右扫一遍,左括号 +1、右括号 −1,扫完应为 0,中途不能变成负数。 不要用中文的 `{}` `()`,也不要用方头括号 `【】` 来代替花括号。
开始练习
返回顺序结构
登录
注册
忘记密码
点击此处输入用户名
点击此处输入密码
登录
点击此处输入用户名
点击此处输入密码
点击此处输入邮箱
发送验证码
点击此处输入验证码
点击此处输入邮箱
发送验证码
点击此处输入验证码
点击此处输入新密码