以下C程序的输出是什么?
df2 %>%
mutate_at(c("NO3", "NO4", "NO5"), ~(lead(.x) + .x)*(lead(depth)-depth)) %>%
summarize_at(c("NO3", "NO4", "NO5"), sum, na.rm = T)
df2 %>%
mutate_at(vars(NO3:NO5), ~(lead(.x) + .x)*(lead(depth)-depth)) %>%
summarize_at(vars(NO3:NO5), sum, na.rm = T)
df2 %>%
mutate_at(2:4, ~(lead(.x) + .x)*(lead(depth)-depth)) %>%
summarize_at(2:4, sum, na.rm = T)
NO3 NO4 NO5
1 325 380 220
_if
df2 %>%
mutate_if(str_detect(colnames(.), "NO"), ~(lead(.x) + .x)*(lead(depth)-depth)) %>%
summarize_if(str_detect(colnames(.), "NO"), sum, na.rm = T)
df2 %>%
mutate_if(!str_detect(colnames(.), "depth"), ~(lead(.x) + .x)*(lead(depth)-depth)) %>%
summarize_if(!str_detect(colnames(.), "depth"), sum, na.rm = T)
NO3 NO4 NO5
1 325 380 220
main()
{
char g[] = "geeksforgeeks";
printf("%s", g + g[6] - g[8]);
}
geeks
答案是1:rgeeks
。
但是我和某人争论,他说这是不确定的行为。那么它是未定义的行为吗?
答案 0 :(得分:1)
由于associativity of +
operator,此涉及指针算术的语句为UB。
在这种情况下(考虑ASCII编码)
g[6]
是o
,其十进制值为111 g[8]
是g
,其十进制值为103 所以,最终构造看起来像
printf("%s", g + 'o' - 'g');
与
相同printf("%s", (g + 111) - 103);
在这里,g+111
指向数组之后(请注意:仅涉及数组后一个元素的算术是有效的),因此它将是UB。
但是,如果我们像这样修改语句
printf("%s", g + (g[6] - g[8])); //enforcing precedence
与
相同printf("%s", g + 8);
或
printf("%s", &(g[8]));
然后它将是有效的。但是,如果使用了其他编码系统,并且(g[6] - g[8])
的值不在数组范围之内,出于与原始语句相同的原因,它将再次为UB。