- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有一个函数 foo(x, y, z)
是不变的 w.r.t.其参数的所有排列。我还有一个迭代器 it
,这样迭代器 it
、it + 1
和 it + 2
可以是取消引用。
这样写好不好
... = foo(*it++, *it++, *it++); // (1)
代替
... = foo(*it, *(it + 1), *(it + 2)); // (2)
?
据我所知,从 C++17 开始技术上它是正确的(引用 cppreference.com 并考虑到 it
可以是原始指针)
15) In a function call, value computations and side effects of the initialization of every parameter are indeterminately sequenced with respect to value computations and side effects of any other parameter.
函数参数的求值顺序没有定义,但对于 foo()
来说,顺序无关紧要。
但这是一种可以接受的编码风格吗?一方面,(1)
很好地对称并且暗示 foo
具有这样的不变性,而 (2)
看起来有些难看。另一方面,(1)
立即引发对其正确性的质疑——阅读代码的人应该检查 foo
的描述或定义以验证调用的正确性.
如果 foo()
的主体很小,并且函数定义的不变性很明显,您会接受 (1)
吗?
(大概,这个问题是基于意见的。但我还是忍不住问了。)
最佳答案
你在 C++17 中是正确的
foo(*it++, *it++, *it++);
不是未定义的行为。正如您的报价所述,并如 [expr.call]/8 中所述
The postfix-expression is sequenced before each expression in the expression-list and any default argument. The initialization of a parameter, including every associated value computation and side effect, is indeterminately sequenced with respect to that of any other parameter.
每个增量都是有序的,因此您不会有多个未排序的写入。函数参数的求值顺序在 C++17 中仍未指定,这意味着您只有未指定的行为(您无法知道哪个元素被传递给每个参数)。
只要你的函数不关心这个就没问题。如果参数的顺序很重要,那么您将不得不使用第二个版本。
综上所述,我更愿意使用
foo(*it, *(it + 1), *(it + 2));
即使顺序无关紧要。它使代码向后兼容,恕我直言,它更容易推理。我宁愿在 for 循环的增量部分看到 it += 3
,然后在函数调用中看到多个增量,而在循环的增量部分没有增量。
关于c++ - 调用参数置换不变函数 f(i++, i++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52430588/
我有 2 个表 t1,其中存储价格和项目类型以及一个 ENUM 值和 t2,其中存储销售数量。我有一个计算总销售额(价格 * 数量)的查询,但我需要计算两个结果数字之间的差值。 两个数之差的计算公式应
我在使用 zsh 运行 Big Sur 11.2 的 Mac 上更改运行的 java 版本时遇到问题。我想将 Java 1.8 设置为默认设置,因此我使用以下命令设置 JAVA_HOME: $ uns
在下面的代码中,当我改变选择时,会有一个alert。我试图使该功能类似于当我单击 option 时它会显示 alert。 $(document).ready(function() { $("#x"
好吧,我正在制作一个简单的 react 游戏,我的代码如下。现在,当调用 startGame() 时,如果我注释掉 while 循环,一切都会发生,但是当我使用 thread.sleep(1000)
我目前正在尝试将 .plist 文件中的 CFBundleURLTypes 的值更改为新值,但似乎没有任何效果,并且如果我调用,旧值仍然存在 NSLog(@"%@", [[NSBundle mainB
我正在尝试使用 Jsoup 中的解析函数来解析 html 字符串。 我尝试阅读了很多相关的帖子以及API,但仍然没有找到答案。 String html = ""others"; Docume
我正在尝试为水平列表项关闭设置动画alpha 动画有效,layoutparam 值也随时间减少但出于某种原因,这并没有改变列表项的实际高度。 @Override protected void appl
双管道等于: MY_CONST ||= 42 运算符定义? MY_CONST = 42 unless defined? MY_CONST 为什么第二种方式更为普遍?第一个有什么缺点吗? 最佳答案 在一
我希望我的站点地址栏在访问子页面时不要更改其地址,它应该显示我的 index.html ,即使我进入 tosub 页面。 就像我打开 www.xyz.com我导航到它仍应显示的任何页面 www.xyz
我试图通过将购物车存储在数据库的表中来创建购物车,而不是使用内置的 CI 购物车类。我使用 sessionID 来识别一个访问者和另一个访问者。但是我发现sessionID在一段时间内一直在变化,连访
我面临一个奇怪的问题。一旦更改了.java文件-看来测试仍在使用该文件的早期版本(.class)。 从我的 Angular 来看,应该从.build文件夹中删除该类,并从新版本的.java文件重新编译
下面的R代码显示了一个关于向量组合的例子,之后,向量“c”的属性变成了字符。如何让它仍然保持属性为数字? a='aa';b='bb';c=c(1,2,3,4,5) dd=data.table(cbin
我一直在使用 Kinect 和语音识别,我注意到我无法让 AudioLevel 成员从我的 SpeechRecognitionEngine 对象中更改。 我成功地让命令被识别,所以我知道 kinect
大家好,我已经实现了通知功能。我对通知 ID 有疑问。 这是我的代码: protected void ShowNotification(String title, String text){ Noti
所以我第一次正确设置了 UIView 图层的阴影(它显示得非常好)但是当我尝试更改颜色时(没有别的,只是 layer.shadowColor)它不会在 View 中更新。它仍然显示原始颜色。我已经尝试
使用 java 我想在一个程序中生成一些随机值,然后在每次执行第二个程序时在其他程序中使用这些值。 这样做的目的是生成一次随机值,然后在以后每次运行程序时保持并保持它们不变。有可能吗?谢谢 最佳答案
我有几个组件,所有组件都继承了 JCheckBox 而没有覆盖它的任何内容,存储在一个 vector 中,然后遍历该 vector 并将每个组件添加到一个对话框中 CreateLists(); //
我有一个 UITabBarController。现在我想在其上方添加一个 View ,并在用户切换到另一个选项卡时使 View 保持不变。我尝试创建一个 UIViewController,并将 UIT
我正在使用 curses 来打印一个非常漂亮的控制台 UI,我需要它依赖于终端大小。为此,我阅读了 here ,我可以使用 shutil.get_terminal_size .所以我正在做这段代码:
我有一个jsfiddle here . fiddle 中有许多标记文本框。在文本框中输入一个数字,然后继续单击“添加问题”按钮。您将看到剩余的总分等于 10,但它不会改变。剩余分数的数量应该通过减去附
我是一名优秀的程序员,十分优秀!