首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将类型修饰符从前缀转换为C-fix

将类型修饰符从前缀转换为C-fix
EN

Code Golf用户
提问于 2022-04-10 05:03:24
回答 2查看 341关注 0票数 9

给定一个基本类型的T,可以用*[]来增强它,每个指针和数组都是这样。例如,[]*T的意思是“指向T的指针数组”,*[]T的意思是“指向T数组的指针”。

让我们调用*[]类型修饰符。C有一种将这些修饰符与求值顺序联系起来的排序方法。C风格的[]*T变成T *[]*[]T变成T (*)[].通过查看下面的示例,您可能能够理解转换是如何工作的。在这篇文章的末尾也作了解释。

代码语言:javascript
复制
* -> *
[] -> []
[]* -> *[]
*[] -> (*)[]
*[]* -> *(*)[]
[]*[] -> (*[])[]
*[][]* -> *(*)[][]
[]**[] -> (**[])[]
[]*[]* -> *(*[])[]
*[]*[] -> (*(*)[])[]

您的程序或函数应该处理输出字符串的输入字符串,如上面的示例所示。输入将只包含没有空白空间的*[]

这个挑战是反向的这一挑战,简化了。

C-fix规则:

  • 所有的*s总是先于所有的[]s (在真实的C代码中,变量名介于最后一个*和第一个[]之间)。
  • 计算从中间开始,变量名在中间。
  • 如果左边有一个*,右边有一个[],没有任何括号来确定顺序,那么[]首先绑定,并在前缀:中排在第一位。
    • C-fix *[] =C *a[] (其中a是变量名)=“指针数组”=前缀[]*

  • 为了改变计算的顺序,以便首先绑定一个*,必须将它放在括号中(变量名在哪里):
    • 前缀*[] =“指向数组的指针”=C(*a)[](其中a是变量名) = (*)[]

从上一个例子来看,实际C代码中的(*(*)[])[]将类似于int (*(*a)[])[] (其中a是变量名)。计算从a开始,除非一组圆括号阻止绑定,否则首先绑定[]

如果将int (*(*a)[])[]放置到cdecl.org,则输出为“声明指向指向int数组的指针数组的as指针”。这是因为:

  • 由于括号,第一个*首先被绑定。
  • 变量名称和[]之间没有括号,导致在下一个*之前绑定。
  • 然后,将绑定下一个*,因为它位于带有变量名的括号中,而其余的[]则不是。
  • 最后,剩余的[]被绑定。

这是前缀的*[]*[]int a。因此,*[]*[] -> (*(*)[])[]

EN

回答 2

Code Golf用户

发布于 2022-04-10 06:10:40

咖喱,90字节

代码语言:javascript
复制
f s@(""?"[]")=s
f(s++"*")='*':f s
f(s++"*[]")="(*"++f s++")[]"
f(s++"][]")=f(s++"]")++"[]"

在网上试试!

票数 4
EN

Code Golf用户

发布于 2022-04-12 15:20:53

木炭,27字节

代码语言:javascript
复制
FS≔⎇⁼ι*⁺ιω⁺⎇∧ω⁼§ω⁰*⪫()ωωιωω

在网上试试!链接是详细的代码版本。解释:

代码语言:javascript
复制
FS

循环所有输入字符。

代码语言:javascript
复制
≔⎇⁼ι*⁺ιω⁺⎇∧ω⁼§ω⁰*⪫()ωωιω

如果当前字符是*,则将其放在前面。否则,追加它,但是如果输出字符串以*开头,那么首先将其包装在()中。

代码语言:javascript
复制
ω

输出最后一个字符串。

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/246125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档