编辑:尚未回答 - 链接的问题是关于普通的r值,初始化列表是一个单独的,如果相关的概念.
这个语句定义得很好,或者在初始化列表中使用前缀增量运算符,对于在列表中出现两次的变量,未定义的行为?
struct T t = { i, ++i };
Run Code Online (Sandbox Code Playgroud)
我对ANSI C最感兴趣,但知道其他版本的C和/或C++是否有所不同也很有用.如果类似以下的类似结构是合法的:
struct T t = { i, i++ };
struct T t = { ++i, ++i };
struct T t = { i++, ++i };
struct T t = { i++, i++ };
Run Code Online (Sandbox Code Playgroud) 在下面的代码中是否需要f1在之前调用f2(反之亦然)或者是否未指定?
int f1();
int f2();
std::initializer_list<int> list { f1(), f2() };
Run Code Online (Sandbox Code Playgroud) 我在C开发了很多年,现在才发现一个程序可以在main()函数之前执行代码.这是一个代码示例
int generateNum(){
// Some malicious code here...
return 5;
}
static int someArray[] = {generateNum(),generateNum()}
int main(){
// Some code here...
}
Run Code Online (Sandbox Code Playgroud)
该函数generateNum()之前被调用两次main().
我的问题是
考虑以下代码:
int main()
{
int count = 0 ;
int arrInt[2] = { count++, count++ } ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
如果我们使用clang -std=c++03它编译代码,则会产生以下警告(实时示例):
warning: multiple unsequenced modifications to 'count' [-Wunsequenced]
int arrInt[2] = { count++, count++ } ;
^ ~~
Run Code Online (Sandbox Code Playgroud)
我不是在提倡这样的代码,但是在另一个问题中出现了类似的代码,并且对于是否根据标准C ++ 11进行定义存在分歧。在C ++ 11中,根据初始化程序中的多个突变是否列出未定义的行为,此行为是定义良好的行为,并且如果我使用该警告,则该警告消失了。-std=c++11
如果我们看一下C ++ 11 之前的标准草案,它没有覆盖initializer-list的相同语言,那么似乎我们剩下的是Chapter 5 Expressions第4段:
除非另有说明,否则未指定各个运算符的操作数和各个表达式的子表达式的求值顺序以及发生副作用的顺序。57)在上一个序列点与下一个序列点之间,标量对象最多应通过表达式的计算修改其存储值。此外,应仅访问先验值以确定要存储的值。对于完整表达式的子表达式的每个允许的排序,都应满足本段的要求;否则,行为是不确定的。
为了使这个未定义,我们似乎必须将其解释count++, count++ …
我相信我想做的事情可能是有效的,因为它在两种情况下都用逗号分隔(不是典型的作业),但我不确定并且搜索不会显示有关这两个的任何内容具体情况。
在这两种情况下,我都使用变量作为两个并行数组的索引。
int a[3] = {10, 20, 30};
int b[3] = {20, 40, 60};
Run Code Online (Sandbox Code Playgroud)
情况#1:初始化数组的结构
struct testStruct {
int t1;
int t2;
};
int i = 0;
testStruct test = {a[++i], b[i]}
Run Code Online (Sandbox Code Playgroud)
最终行的预期结果:test = {20, 40}
情况#2:将数组中的特定值作为函数参数传递
void testFunc(int t1, int t2) {
// do stuff
}
int i = 0;
test(a[++i], b[i]);
Run Code Online (Sandbox Code Playgroud)
最终行的预期结果:test(20, 40)
这是有效的代码吗?如果是,它在所有编译器中都有效吗?
结果是我期望的吗?如果是这样,是因为数组还是因为逗号?
谢谢!
这是示例代码:
X * makeX(int index) { return new X(index); }
struct Tmp {
mutable int count;
Tmp() : count(0) {}
const X ** getX() const {
static const X* x[] = { makeX(count++), makeX(count++) };
return x;
}
};
Run Code Online (Sandbox Code Playgroud)
这将在静态数组构造中报告CLang build 500上的Undefined Behavior.为了简化这篇文章,计数不是静态的,但它不会改变任何东西.我收到的错误如下:
test.cpp:8:44:警告:对'count'的多次无序修改[-Wunsequenced]