【发布时间】:2014-08-11 04:05:25
【问题描述】:
我 - 相信 - 我正在尝试做的事情可能是有效的,因为它在两种情况下都用逗号分隔(不是典型的分配),但我不确定并且搜索没有提出任何内容关于这两种具体情况。
在这两种情况下,我都将变量用作两个并行数组的索引。
int a[3] = {10, 20, 30};
int b[3] = {20, 40, 60};
情况 #1:初始化数组的结构
struct testStruct {
int t1;
int t2;
};
int i = 0;
testStruct test = {a[++i], b[i]}
最后一行的预期结果:test = {20, 40}
情况 #2:将数组中的特定值作为函数 args 传递
void testFunc(int t1, int t2) {
// do stuff
}
int i = 0;
test(a[++i], b[i]);
最后一行的预期结果:test(20, 40)
这是有效的代码吗?如果是,它在所有编译器中都有效吗?
结果是我所期望的吗?如果是这样,是因为数组还是因为逗号?
谢谢!
【问题讨论】:
-
情况一不是逗号操作符,但有一个序列点,见Are multiple mutations of the same variable within initializer lists undefined behavior pre C++11和Are multiple mutations within initializer lists undefined behavior? ...情况二是未定义的行为,同样不是逗号操作符。
-
感谢您的链接,我从来不知道要搜索这些术语(有点超出我的能力)。很高兴知道至少第一个实例有效。
-
请注意,在 C++11 之前的第一个实例中,未指定评估顺序。我建议不要使用棘手的代码,您可以执行
{a[i], b[i+1]}等...并在之后增加i,您不必担心标准的奇怪角落
标签: c++ undefined-behavior pre-increment