2011-01-23 16 views
2

我正在读“了Bjarne Stroustrup的C++风格和技法”常见问题,他提到这个FAQ What's the value of i++ + i++?序在C++函数的参数

在此,他提到” ...的功能评价的顺序参数未定义。“当他提到f(v [i],i ++)时;例。

我是知道的函数参数的计算顺序是不确定不是不确定的,但在这种情况下是不确定的,因为我们都是靠我的价值,以其中V [I]通过或它的FAQ中的错误?

+0

我真的相信只有需要关心* unspecified *和* undefined *之间区别的人才是C++编译器作家... – Oystein 2011-01-23 07:46:06

+0

@David关于如何使用SO,我在这里获得不关心速度,徽章和否的知识。你的选票...你会在你死的时候把所有这些都带走。 – 2011-01-23 09:17:10

回答

4

函数参数的求值顺序未指定,但表达式的行为未定义。 Bjarne错了。 :-)

退房this线程了解未指定行为和未定义行为之间的区别。

我曾问过Bjarne的区别unspecifiedundefined之间,这是他的答复..

就个人而言,我不和“不确定”和“不确定”之间的区别麻烦;你知道这是什么吗?该代码应采取出去枪毙在两种情况下:(小心避免“不确定”和“未指定”字样)

.....

你并不需要知道:只要避免两者。如果有人真的想知道他们可以在C++或C标准中查找定义(我敢打赌,C和C++标准会对不重要的细节持不同意见)。

0

我觉得我们在这里失去了语义。规范是定义,直接或通过省略。许多未指定的行为留给允许通过实现定义的行为进行优化,导致未定义的行为,至少如果您将您的代码移动到不同的编译器或硬件,所以您的代码失去了一般性,并且它也可能失去了清晰度和简单性。就像Brian Kernighan所说的那样,试图利用潜在的“副作用”手段的代码往往不是很好的风格。但有趣的是,有人看到有人指出Bjarne Stroustrup“失误”。 :)