【问题标题】:Order of Function arguments in C++C++ 中函数参数的顺序
【发布时间】:2011-01-23 06:43:51
【问题描述】:

我正在阅读“Bjarne Stroustrup 的 C++ 风格和技术”常见问题解答,他提到了这个常见问题解答 What's the value of i++ + i++?

在此他提到“......函数参数的评估顺序是未定义的。”当他指的是 f(v[i],i++);例子。

我知道函数参数的求值顺序是 unspecified 不是未定义的,但在这种情况下它是未定义的,因为我们依赖 i 的值来判断 v[i]通过或它的常见问题解答本身的错误?

【问题讨论】:

  • 老实说,我认为唯一需要关心 unspecifiedundefined 之间区别的人是 C++ 编译器编写者...
  • @David 它与如何使用 SO 有什么关系,我来这里是为了获得与费率、徽章和编号无关的知识。票数......当你死的时候,你会带着这一切。
  • 如果你和这里的系统一起玩,你可能会发现人们更愿意提供帮助,从而能够获得更多的知识。这就是我的观点。

标签: c++ parameters evaluation


【解决方案1】:

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

查看this 线程以了解未指定行为和未定义行为之间的区别。

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

就个人而言,我不关心“未定义”和“未指定”之间的区别;你知道这是什么吗?在任何一种情况下都应该取出并拍摄该代码:(小心避免使用“未定义”和“未指定”)

.....

您无需知道:只需避免两者。如果有人真的想知道他们可以查找 C++ 或 C 标准中的定义(我敢打赌,C 和 C++ 标准会在不重要的细节上存在分歧)。

【讨论】:

  • 感谢 prasoon!用于发布 Bjarne 回复。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 2017-11-11
    • 2019-10-10
    • 2020-08-03
    相关资源
    最近更新 更多