我在打代码高尔夫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里捕捉到?:。该死的操作员优先权。我是个白痴。:)

最佳答案

代码的问题是缺少括号。这工作非常好:

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

在原始代码中,第一个?:运算符的条件是
"Fizz\0FizzBuzz"+i%15

这不是你想要的。
Demo.

08-28 08:22