C语言初学者常犯的17条错误

简介: C语言不是一门简单的编程语言,新手容易犯很多错误,本文试列举17条C语言初学者易犯的错误。

错误1:scanf中丢失&

int a;
printf("Enter an integer:\t");
scanf("%d", a);

上面的代码第3行,a前面漏了&

更正:

int a;
printf("Enter an integer:\t");
scanf("%d", &a);

错误2:在比较语句中使用=代替==

if (x=1)
    printf("Found!\n");

在一般的编程语言中共有的下面的语法:
=代表赋值
==代表相等的判断

应该这么改写:

if (x==1)
    printf("Found!\n");

错误3:索引超出数组的末端元素

int array[10];
array[10]=42;

数组索引从0开始,终止于n-1,这个对长度为10的数组的索引10元素进行操作明显是越界了。
既然是写最后一个元素,那下标应该是9:

int array[10];
array[9]=42;

错误4:在#define语句中使用=

# define NUM = 4

这里不能用等号啊~~
应该改成这样:

# define NUM 4

错误5:使用未初始化的变量

int i;
if (i == 10)
    //do something

在Java里这就是最恐怖的“空指针异常(NullPointerException)”,无论在哪里都是要避免的,要有初始化再调用的好习惯:

int i = 10;
if (i == 10)
    //do something

错误6:未包含用户创建头文件的路径

# include "myfile.h"

地址路径不对,例如:

# include "code\myfile.h"

错误7:使用逻辑运算符(!, ||, &&)代替位运算符(~, |, &)

char x =! 5;
char y = 5 || 2;
char z = 5 && 2;

上面的其实是逻辑运算符,我们实际上想用的是位运算符:

char x = ~5;
char y = 5 | 2;
char z = 5 & 2;

上面的语句分别代表非、或、与。

错误8:在switch/case语句中遗漏break语句

char x = 'd';
//do something
switch (x) {
    case 'u': direction = 1;
    case 'd': direction = 2;
    case 'l': direction = 3;
    case 'r': direction = 4;
    default: direction = 0;
}

应该有加上break的好习惯:

char x = 'd';
//do something
switch (x) {
    case 'u': direction = 1; break;
    case 'd': direction = 2; break;
    case 'l': direction = 3; break;
    case 'r': direction = 4; break;
    default: direction = 0;
}

错误9:遗漏大括号{}

if (ptr == NULL)
    printf("Unable to open a file.\n");
    exit(1);
//do something

Java和C一样,不加{}的话循环语句和分支语句只包含紧接着的一句。
毕竟C、Java这种语言不看缩进,不像Python。
所以exit(1)实际上式if结束以后必然会执行的语句。
应该这么写:

if (ptr == NULL) {
    printf("Unable to open a file.\n");
    exit(1);
}
//do something

错误10:在函数声明之前使用函数

int main(void) {
    test();
}

void test() {
    //do something
}

没定义怎能使用?
所以换个顺序就OK:

void test() {
    //do something
}

int main(void) {
    test();
}

错误11:用同一个名称声明的局部和全局变量

int x = 5;
int test(void) {
    int x = 3;
    //do something
}

变量命名对冲了,能避免就要避免这种事:

int x = 5;
int test(void) {
    int y = 3;
    //do something
}

错误12:在数组声明后尝试使用{}初始化该数组

int scores[3];
scores = {93, 91, 97};

不能这么搞啊,只能是下面两种方式:

int scores[3] = {93, 91, 97};
int scores[3];
scores[0] = 93;
scores[1] = 91;
scores[2] = 97;

错误13:使用=将一个数组赋值给另一个数组

int scores = {93, 91, 97};
int scores2[3];
scores2 = scores;

C语言不同于Java,Java可以“数组间赋值”(其实还是用了ArrayCopy)
这么写才是对的:

int scores = {93, 91, 97};
int scores2[3];
int i;
for (i = 0; i < 3; i++)
    scores2[i] = scores[i];

应该用一个循环给数组逐位赋值。

错误14:do/while循环后遗漏分号

int num;
do {
    num  = getNum();
} while (num < 100)

do...while语句最后需要一个分号结尾:

int num;
do {
    num  = getNum();
} while (num < 100);

错误15:for循环使用逗号代替分号

int i;
for (i = 0, i < 200, i++)
    //do something

一定要用分号(;)啊:

int i;
for (i = 0; i < 200; i++)
    //do something

错误16:整数除法代替浮点数除法

float x = 9/4;

两个整数的直接除法是生成一个截断后的整数。
应该这么写除法才能得到一个浮点数:

float x = 9.0/4;

得到2.25。

错误17:写入未初始化的指针

int *y = 77;

这是不对的,应该这么写:

int x, *y = &x;
*y = 77;
相关文章
|
C语言 C++
C语言小项目——通讯录(适合刚学完C语言的初学者)
C语言小项目——通讯录(适合刚学完C语言的初学者)
C语言小项目——通讯录(适合刚学完C语言的初学者)
|
存储 自然语言处理 编译器
用c语言手搓一个500+行的类c语言解释器: 给编程初学者的编译器教程(2)- 简介和设计
通常我们说的 “编译器” 是一种计算机程序,负责把一种编程语言编写的源码转换成另外一种计算机代码,后者往往是以二进制的形式被称为目标代码(object code)。这个转换的过程通常的目的是生成可执行的程序。 而解释器是一种计算机程序,它直接执行由编程语言或脚本语言编写的代码,它并不会把源代码预编译成机器码,而是一行一行地分析源代码并且直接执行,相对编译器而言可能效率较为低下,但实现也相对简单,并且容易在不同的机器上进行移植(比如x86和mips指令集的机器)。
472 0
|
编译器 BI C语言
用c语言手搓一个500+行的类c语言解释器: 给编程初学者的编译器教程(1)- 目标和前言
这一系列教程希望面向初学者,使用c语言手工实现一个简单的解释器来玩,不需要您掌握除了c语言以外的其他前置知识,也不需要您学习过编译原理的相关知识(当然如果能对简单的数据结构有所了解的话会更好,比如树、栈等)。 > 写一个能执行代码的解释器不仅是一件很有(zhuang)趣(bi)的事情,大概也可以作为刚学习完c语言的一个练手的小项目啦 不同于大部分常见的其他只支持四则运算的所谓”手工解释器“教程,我们希望在代码结构尽量清晰的600行代码中,手工(不借助lex/yacc等工具)完成一个脚本语言“try”,实现以下功能:
1735 0
|
C语言
新手最常见的10个C语言错误,有人甚至全都中了!
新手最常见的10个C语言错误,有人甚至全都中了!
2319 0
|
C语言 人工智能
C语言大牛推荐初学者不要犯的17种BUG
喜欢这篇文章的朋友可以多多收藏、点赞、关注 一条龙~
1579 0
|
C语言 C++
C语言初学者必须掌握的关键字!
C语言初学者必须掌握的关键字!
1632 0
|
程序员 C语言 人工智能
C语言初学者关于数组指针的深度讨论
一、什么是数组指针? 即是数组的指针。首先它是一个指针,指向数组,指针本身占4个字节。 二、数组指针的使用 int a[3][5];int (*p)[5];p=&a;第二行定义了一个数组指针,p是指针名,指向一个含有5个int类型数据的数组。
1015 0
|
程序员 C语言
《C语言程序设计进阶教程》一3.2.2 错误数组下标
本文讲的是C语言程序设计进阶教程一3.2.2 错误数组下标,本节书摘来华章计算机《C语言程序设计进阶教程》一书中的第3章,第3.2.2节, Intermediate C Programming[美] 陆永祥(Yung-Hsiang Lu) 著 徐东 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1133 0