我在打代码高尔夫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.