暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

编程时常见的8种错误

CPP开发前沿 2021-11-15
1143
大家都知道,学习编程是一件很枯燥的事情,尤其是在运行程序时始终得不到自己想要的结果,经过一番调试后依旧不得其解的时候,相信这种情况每一个程序员都遇到过,这也是一个伟大的程序员诞生的必经阶段。
令人可悲的是,相同错误依旧在不断的发生。但幸运又随之而来,在这里,我将新程序员遇到过的最常见的8个错误集合到一起,方便大家学习

1 使用单“=”检查是否相等
char x='Y';
while(x='Y')
{
//...
  cout<<"是否继续? (Y/N)";
cin>>x;
}
上面的代码会将是一个死循环~~像风一样自由~~~
代码在循环条件判断时使用了一个等号来检查是否相等,实际上程序在执行时会把表达式右边的值赋给左边的变量,实际上是执行了变量的赋值。在本例中,值是'Y',它被视为true。因此,循环永远不会结束。因此要解决上面的问题需要做如下改动:
  • 使用==检查是否相等;

  • 为了避免意外赋值,将变量放在表达式的右侧,如果不小心使用了一个等号,就会出现编译错误,因为不能将值赋给非变量的东西。

char x='Y';
while('Y'==x)
{
//...
cout<<"是否继续? (Y/N)";
cin>>x;
}

2 变量赋值
#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 变量未声明
#include <iostream>
using namespace std;
int main()
{
cin>>x;
cout<<x;
return 0;
}
编译时,编译器将会报错。因为编译器并不知道我们x的含义,所以在使用时必须进行声明。如下:
#include <iostream>
using namespace std;
int main()
{
    int x=0;
cin>>x;
cout<<x;
return 0;
}

4 变量未初始化
#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 函数未定义
int main()
{
add();
}
void add()
{
//...
}

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

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

void add()
{
//...
}
int main()
{
add();
}


6 多余的分号

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

#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 数组边界溢出

#include <iostream>
using namespace std;
int main()
{
int array[10];
for(int x=1; x<=10; x++)
cout<<array[x];
return 0;
}

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

 int array[10];
    for(int x=1; x<10; x++)
cout<<array[x];

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


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

#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))才能满足退出条件。如果对这个条件有疑问的话大家可以自行在复习下离散数学。


参考:

     1、https://www.cprogramming.com/tutorial/common.html


- EOF -


扫码关注


图文:龙小

排版:龙小

赞和在看就是最大的支持❤️


文章转载自CPP开发前沿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论