这是本系列的第一篇文章,我想它适合开始一些新的程序员都会遇到更多的基本问题。本系列以后的文章将解决日益复杂的自然的编程错误。
无论一个程序员的经验水平,错误发生,无论是通过知识的缺乏,一个错字,或一般的疏忽,知道哪些问题是最有可能引起麻烦,可以帮助减少他们可能带来麻烦。虽然是无可取代的经验和知识,良好的单元测试可以帮助捕捉这些之前把它们埋层之下的其他代码!
相关文章:
许多C++程序员忘记,其实有两个新的运营商删除两种形式:一个标量版本,以及一系列的版本。
算子是用于分配新的标量(非数组)在堆中的数据。如果被分配的对象是一个类类型对象的构造函数被调用。
Foo* pscalar = new Foo;
删除算子是用来摧毁一个标量对象已使用新的运营商分配。如果对象被破坏是一个类类型的对象的析构函数被调用。
删除pscalar;
现在考虑下面的代码片段:
Foo*阵列= new Foo [ 10 ];
这段代码分配10 foo数组。因为下标[ 10 ]设置int类型说明符之后,许多C++程序员不知道算子新的[ ]被称为做数组分配而不是操作。运营商新的[ ]确保调用构造函数为每个对象被构造。
相反,删除数组,删除[]运算符应用于
一个副作用是由于一个运算符,表达式,语句,或函数后仍然算子,表达,陈述,或已完成的评价功能。
副作用是非常有用的:
x = 5;
赋值操作符改变了x的值永久的副作用。C++的其他运营商提供有用的副作用包括* =,= % =,+ /,=,=,< < =,> > =、=,=,|,^ =,和臭名昭著的+和-算子。
然而,在C++里操作的顺序是不确定的几个地方,这可能会导致不一致的行为。比如说呢。
无效的多(x,y)
{
使用std命名空间;
cout << x×y << endl;
}
国际main()
{
int x = 5;
std::cout <<乘(X,X + +);
}
因为multiply()的函数参数的求值顺序是不确定的,这可以打印30或36,这取决于x + x首先计算。
一个涉及运营商略陌生人的例子:
int foo(x)
{
返回x;
}
国际main()
{
int x = 5;
std::cout << foo(x)* foo(+ + x);
}
由于对C++的操作符的操作数求值顺序是不确定的(对大多数运营商也有少数例外),这也可以打印30或36,这取决于左或右操作数求值第一。
同时考虑下列化合物的表达:
如果(X = = 1 & + y = = 2)
/ /做某事
程序员的意图可能是说“如果X为1和Y前递增的值是2,那么做点什么”。然而,如果X不等于1,C + +采用短路求值,这意味着+ Y从未被评估!因此,你只会增加如果x的值为1,这可能不是程序员想要的!
一个好的经验法则是把任何导致副作用的运算符在它自己的声明。
本文探讨了C++编程中常见的陷阱,如对new和delete操作符的误解,以及由操作符求值顺序不确定性引起的副作用问题。

1441

被折叠的 条评论
为什么被折叠?



