Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;疯狂的typedef:标准允许这种语法有什么意义?_C++_Typedef_Standards Compliance_Iso_User Defined Types - Fatal编程技术网

C++ C++;疯狂的typedef:标准允许这种语法有什么意义?

C++ C++;疯狂的typedef:标准允许这种语法有什么意义?,c++,typedef,standards-compliance,iso,user-defined-types,C++,Typedef,Standards Compliance,Iso,User Defined Types,老一套: typedef int cute_int; //cute : common and familiar syntax. 这种语法非常完美。没问题 现在,当我们可以像上面那样编写typedef时,那么允许这种语法的意义是什么: int typedef crazy_int; //crazy : uncommon and unfamiliar syntax. 只是为了迷惑程序员?在任何地方都需要这种语法吗(实际上我们已经使用了前一种语法)?从编译器的角度来看,你是怎么想的?他们觉得它可爱

老一套:

typedef int cute_int; //cute : common and familiar syntax. 
这种语法非常完美。没问题

现在,当我们可以像上面那样编写typedef时,那么允许这种语法的意义是什么:

int typedef crazy_int; //crazy : uncommon and unfamiliar syntax.
只是为了迷惑程序员?在任何地方都需要这种语法吗(实际上我们已经使用了前一种语法)?从编译器的角度来看,你是怎么想的?他们觉得它可爱还是疯狂?或者这对编译器来说根本不重要


顺便说一下,这个代码来自这里:


如果您想知道这是否是语法错误,请访问ideone。

我不确定standart是否允许这样做。但是,正如我们所知道的,C++中有很多东西是允许的,但有一些语法错误。例如,这类东西
1[a],“hello”[2];/

我不知道这种语法,尽管我的g++似乎接受了它。。。但从编译器的角度来看,这使解析变得更加困难:当您遇到
int
标记时,您不知道是在解析类型定义(并且
typedef
即将发生)还是在解析变量/函数定义

<> P>唯一的意义是:<代码> TyBuffB/CODE >如果你认为<代码> TyPulf是二进制运算符(在类型分配的意义上是“代码> A= B < /代码>”)

< P> Bjarne Stroustrup

< P>问题是“为什么它迷惑了你?”< /P>

语法来自C++中声明说明符的语法,这是非常通用的,并用于C++中的许多东西。声明说明符的顺序无关紧要。看看这些:

int virtual f() const, *g(int);
int ptr1, *ptr2;
int typedef const *name1, name2;
这相当于:

virtual int f() const;
virtual int* g(int);
int ptr1;
int *ptr2;
typedef const int* name1;
typedef const int name2;

如果你仔细观察它们,你会发现它们的语法实际上是统一的、合乎逻辑的。同样,阅读C++的语法也有帮助。

如果你认为这是一条(1)=>*(A+1)=>*(1 +A)=1(A],这一点可能有点解释。这一点与汇编程序的地址非常类似,所以不那么不合逻辑。C++ +/C几乎是混淆程序员的设计。这是一个明确的设计目标,即最大限度地提高您可以编写的表达式的复杂度-优点是您可以以不同的方式编写大量复杂的代码-缺点是您可以以不同的方式编写大量复杂的代码。@James如果您想看到一种能够最大限度地提高表达式复杂度的语言,你应该学习perl。老实说,我不认为编译器有任何可爱或疯狂的概念。。。这是一个吉戈世界。我想你已经习惯了用“可爱”而不是“疯狂”了
typedef
不像操作符
sizeof
,而是像修饰符一样对待,比如
const
volatile
@BoltClock:这个GIGO术语听起来很有趣!似乎,
typedef
const
单词(你可以写
const int a
,和
int const a
)在同一组中。@Pawel:这组被称为:“decl说明符”,只要语法明确,它不会让解析变得“困难”。所以基本上这种疯狂来自C!顺便说一句,即使它来自C,它也不会让多重语法变得不那么疯狂@ybungalobill:就了解不同的语法而言,这篇文章很好。但问题仍然是:为什么允许不同的语法实现完全相同的事情?真正的问题是,它混淆了程序员关于哪个语法“真的”不同,做的事情真的不同,哪个语法不同,但做的事情完全相同。程序员需要记住,比如说,6个只做2件不同事情的语法@纳瓦兹:问题是你认为这两种形式是不同的语法,但实际上是一样的。因此,我可以说,这样你就不需要记住首先出现的顺序
inline
const
friend
int
@ybungalobill:如果你觉得理解我的评论有困难,那么请用“形式”替换术语“语法”。我的意思是,只要有多个表单做完全相同的事情,语法就很混乱,因为还有其他一组表单做另一件事。想象一下,你有100个表单做一件事,另外100个表单做另一件事。这些表格给我们带来了不必要的困难@纳瓦兹:我不同意。我不知道你的母语是什么,但在俄语中,你可以用所有6种可能的方式排列“你的动词-名词”中的单词。但这并没有让任何人感到困惑。我认为它也适用于计算机语言。当我用C#编写时,它总是让我恼火,因为它强制执行“虚拟”和“重写”等命令。