前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编程时常见的8种错误

编程时常见的8种错误

原创
作者头像
CPP开发前沿
修改2021-11-18 17:30:13
9920
修改2021-11-18 17:30:13
举报
文章被收录于专栏:CPP开发前沿CPP开发前沿

大家都知道,学习编程是一件很枯燥的事情,尤其是在运行程序时始终得不到自己想要的结果,经过一番调试后依旧不得其解的时候,相信这种情况每一个程序员都遇到过,这也是一个伟大的程序员诞生的必经阶段。

令人可悲的是,相同错误依旧在不断的发生。但幸运又随之而来,在这里,我将新程序员遇到过的最常见的8个错误集合到一起,方便大家学习

1 使用单“=”检查是否相等

代码语言:c++
复制
char x='Y';
while(x='Y')
{  
    //...  
    cout<<"是否继续? (Y/N)";  
    cin>>x;
}

上面的代码会将是一个死循环~~像风一样自由~~~

代码在循环条件判断时使用了一个等号来检查是否相等,实际上程序在执行时会把表达式右边的值赋给左边的变量,实际上是执行了变量的赋值。在本例中,值是'Y',它被视为true。因此,循环永远不会结束。因此要解决上面的问题需要做如下改动:

  • 使用==检查是否相等;
  • 为了避免意外赋值,将变量放在表达式的右侧,如果不小心使用了一个等号,就会出现编译错误,因为不能将值赋给非变量的东西。
代码语言:c++
复制
char x='Y';
while('Y'==x)
{  
    //...  
    cout<<"是否继续? (Y/N)";  
    cin>>x;
}

2 变量赋值

代码语言:c++
复制
#include <iostream>
using namespace std;
int main()
{    
    int a, b;
    int sum=a+b;    
    cout<<"input two numbers to add: ";    
    cin>>a;    
    cin>>b;    
    cout<<"The sum is: "<<sum;    
    return 0;
}

上面的代码运行后结果如下:

运行结果
运行结果

明明给a和b都赋值了,为什么sum还是会得出一个异常值呢?下面来看看程序中发生了什么事情。通常初学者认为变量的作用就像等式一样——如果将一个变量赋值为其他几个变量的运算结果,当这些变量发生变化时,如代码中的a和b,变量的值(sum)也会发生变化。但实际情况并不是这样的。在C++中,一旦给某一个变量赋值后,这个变量的值就不会改变,除非给他重新赋值。所以,上面的程序中,由于一开始给sum使用了未经初始化的变量进行赋值,sum也会得到一个随机值,虽然后面对a和b进行了赋值,但是sum是不会被改变的。

3 变量未声明

代码语言:c++
复制
#include <iostream>
using namespace std;
int main()
{
    cin>>x;    
    cout<<x;    
    return 0;
}

编译时,编译器将会报错。因为编译器并不知道我们x的含义,所以在使用时必须进行声明。如下:

代码语言:c++
复制
#include <iostream>
using namespace std;
int main()
{
    int x=0;
    cin>>x;    
    cout<<x;    
    return 0;
}

4 变量未初始化

代码语言:c++
复制
#include <iostream>
using namespace std;
int main()
{
    int count;    
    while(count<100)    
    {      
        cout<<count<<";";      
        count++;    
    }    
    return 0;
}

上面的代码在执行时,并不能像预期的那样进入while循环,因为在C++中,整型的变量并不会默认赋值0.在上面的代码中count可以是int范围内的任何值。例如,它可能是121,在这种情况下,while循环的条件永远不会为真。程序的输出可能是输出从-99到99的数字。

切记:变量一定要进行初始化!!!

5 函数未定义

代码语言:javascript
复制
int main()
{ 
    add();
}
void add()
{  
    //...
}

编译时会报错,明明后面有定义了add函数,为什么还说没有定义add~

在编译代码时,编译器不知道add()代表什么,除非提前告诉它,如果在使用它之后才告诉它有一个名为add的函数,它将会感到困惑。因此一定要在第一次使用函数时,就定义好函数的原型或函数的整个定义。如:

代码语言:javascript
复制
void add()
{  
    //...
}
int main()
{ 
    add();
}

6 多余的分号

这种问题大多出现在for循环中,如:

代码语言:c++
复制
#include <iostream>
using namespace std;
int main()
{    
    int x;    
    for(x=0; x<100; x++);      
    cout<<x;    
    return 0;
}

上面的代码期望是输出0到99的数值,但是实际运行后输出的是:100;原因是在for语句后面多打了一个分号。这样就会将代码原有逻辑改变。因此在编程时切记:分号不能出现在if语句、循环或函数定义之后。如果您在这些位置中放置了一个,您的程序将无法正常运行。

7 数组边界溢出

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main()
{    
    int array[10];    
    for(int i=1; i<=10; i++)      
        cout<<array[i];    
    return 0;
}

在C++中数组索引从0开始。例如,如果你有一个10个元素的数组,第一个元素在位置0,最后一个元素在位置9。

代码语言:c++
复制
 int array[10];
 for(int =1; i<10; i++)      
   cout<<array[i];

上面的代码中还有其它问题,如数组没有进行初始化,这样在输出时,打印出的值实际上是随机值。

8 错误使用“&&”和“||”

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main()
{
    int value;    
    do    
    {      
        //...      
        value=10;    
    }while(!(value==10) || !(value==20));    
    return 0;
} 

代码实现的本意应该是当value等于10或者value等于20的时候,就结束循环。但是实际运行时发现,即使value等于10,也会一直执行这个循环语句。从while表达式分析可知。不可能同时存在value既等于10又等于20的情况。如果要满足上面循环的结束条件,需要将表达式修改成:!(value==10) && !(value==20)或者!((value==10) || (value==20))才能满足退出条件。如果对这个条件有疑问的话大家可以自行在复习下离散数学。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档