这个C99代码是否会产生未定义的行为?
#include <stdio.h>
int main() {
int a[3] = {0, 0, 0};
a[a[0]] = 1;
printf("a[0] = %d\n", a[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在声明中a[a[0]] = 1;,a[0]都是读取和修改.
我看了ISO/IEC 9899的n1124草案.它说(在6.5表达式中):
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.
它没有提到读取对象来确定要修改的对象本身.因此,此语句可能会产生未定义的行为.
但是,我觉得很奇怪.这实际上是否会产生未定义的行为?
(我也想知道其他ISO C版本中的这个问题.)
我有一个包含数字的输入向量.在输出向量中,我需要以从右到左的顺序获得一系列部分乘积.输出的最后一个元素必须等于输入中的最后一个元素; 输出的倒数第二个元素必须是输入的最后一个和倒数第二个元素的乘积; 等等.例如,如果输入向量是
let input = vec![2, 3, 4];
Run Code Online (Sandbox Code Playgroud)
然后我需要输出[24, 12, 4].
我的实现在输入上使用迭代器,反转它,maps,再次反转和collects:
fn main() {
let input = vec![2, 3, 4];
let mut prod = 1;
let p: Vec<usize> = input
.iter()
.rev()
.map(|v| {
prod *= v;
prod
}).rev()
.collect();
println!("{:?}", p);
}
Run Code Online (Sandbox Code Playgroud)
结果[2, 6, 24]就像我删除两个rev()s一样.两人rev()没有解决问题,他们只是"歼灭"对方.
这个任务是否可以在"调用链"样式中解决,而不使用for?