【问题标题】:Can't add to a string literal in C to shift its index无法添加到 C 中的字符串文字以移动其索引
【发布时间】:2025-12-19 20:20:15
【问题描述】:

我正在用 C 语言编写著名的“fizzbuzz”筛选问题(这个问题的重点是了解 C 运算符的工作原理,而不是编写代码;不要让我偏离主题^^“),然后我想出了用这一行:

puts(&"Fizz\0FizzBuzz"[i%15?i%3?9:0:5]));

这对我来说似乎有点不必要,因为我认为我可以这样做:

puts("Fizz\0FizzBuzz"+i%15?i%3?9:0:5));

但是第一个可能是Fizz 的段错误。我的问题是:为什么我不能通过简单地添加来索引字符串文字?我尝试将加数转换为size_t,但这没有任何用处。鉴于对于任意的char *p(或任何类型的指针),p[n] 只是(*p+n) 的语法糖,(我认为)&*p == p.

那么,为什么是&p[n] != p+n

编辑:原来我只是在我的?: 中捕获Fizz\0FizzBuzz"+i%15。该死的运算符优先级。我是个白痴。 :)

【问题讨论】:

  • ?: 运算符的优先级是什么? (有关提示,请参阅 here。)
  • 哦,天哪,我搞砸了条件运算符优先级......我觉得很愚蠢。我现在要删除这个问题吗?
  • 由你决定。如果你不这样做,有人可能会笑出声来。
  • 很公平。不妨编辑我的 OP 以反映我的顿悟。

标签: c string indexing constants


【解决方案1】:

您的代码的问题是缺少括号。这工作得很好:

puts("Fizz\0FizzBuzz"+(i%15?i%3?9:0:5));

在您的原始代码中,第一个 ? : 运算符的条件是

"Fizz\0FizzBuzz"+i%15

这不是你想要的。

Demo.

【讨论】: