这是未定义的行为吗?

时间:2020-07-29 06:14:27

标签: c undefined-behavior pointer-arithmetic

以下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
  1. _if
  2. 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
  3. main() { char g[] = "geeksforgeeks"; printf("%s", g + g[6] - g[8]); }
  4. geeks

答案是1:rgeeks

但是我和某人争论,他说这是不确定的行为。那么它是未定义的行为吗?

1 个答案:

答案 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。