VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 5407|回复: 14

考考你:“int;”这样写编译会不会出错?

[复制链接]
 楼主| 发表于 2010-9-25 11:43:59 | 显示全部楼层 |阅读模式
我刚刚的新发现,哈哈!

看看有多少人跟我一样火星……
发表于 2010-9-25 12:03:53 | 显示全部楼层
按你这样说,肯定不会罗……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-25 12:35:49 | 显示全部楼层
按你这样说,肯定不会罗……
acme_pjz 发表于 2010-9-25 12:03


不错,既然我这么提出,肯定是不会。但我想知道有多少人的第一反应是会
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2010-9-25 12:52:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2010-9-25 14:10:39 | 显示全部楼层
本帖最后由 VBProFan 于 2010-9-25 16:12 编辑

一次写程序时:
struct ProgramLink
{
    struct ProgramLink * next;
    U32 ProgId;
}
BOOL time_cross_prog(...)
紧接着struct声明的后面的是另一个函数的声明:
郁闷的是,编译通不过:“two or more data types in declaration of `time_cross_prog'”
我以为是 BOOL 的问题,在程序段的最前面加了句 #define BOOL char 不行,直接写 char 不行,写 int 也不行。
后来才发现竟然是struct定义的最后面的分号忘记写了!真是气愤至极。于是乎拿起 C 的产生式来研究,以加深印象。

declaration declaration_specifiers ‘;’ | declaration_specifiers init_declarator_list ‘;’
declaration_specifiers → storage_class_specifier | storage_class_specifier declaration_specifiers | type_specifier | type_specifier declaration_specifiers | type_qualifier | type_qualifier declaration_specifiers | function_specifier
| function_specifier declaration_specifiers
type_specifier → VOID | CHAR | SHORT | INT | LONG | FLOAT | DOUBLE | SIGNED | UNSIGNED | BOOL | COMPLEX | IMAGINARY | struct_or_union_specifier | enum_specifier | TYPE_NAME
struct_or_union_specifierstruct_or_union IDENTIFIER '{' struct_declaration_list '}'
| struct_or_union '{' struct_declaration_list '}' | struct_or_union IDENTIFIER
struct_or_unionSTRUCT | UNION

只看红字和黑体部分,得到:
declaration → declaration_specifiers ‘;’
            → type_specifier‘;’
     → struct_or_union_specifier‘;’
     → struct_or_union IDENTIFIER '{' struct_declaration_list '}'‘;’
     → STRUCT IDENTIFIER '{' struct_declaration_list '}'‘;’
但我很快发现,既然 struct_or_union_specifier 和 INT 一样,都是用于声明变量的数据类型,既然 struct 定义时可以不声明具体变量,那么 int 为什么不行呢?
观察产生式,
如果
type_specifier → struct_or_union_specifier
这一步改为
type_specifier → INT
那结果不就是 int;
了吗?
于是赶快在 VC6 和 Linux 下的 gcc 分别做了个实验,结果……
回复 支持 反对

使用道具 举报

发表于 2010-9-25 14:44:34 | 显示全部楼层
5# VBProFan

后来才发现竟然是struct定义的最后面的分号忘记写了!真是气愤至极。
哈哈,低级错误我有时候也犯,不过是写了一段超长的类定义,然后想编译一下,结果出错了……
回复 支持 反对

使用道具 举报

发表于 2010-9-25 15:41:58 | 显示全部楼层
C语言就是麻烦。
容易使人犯低级错误的语言不是好语言。
回复 支持 反对

使用道具 举报

发表于 2010-9-25 16:12:25 | 显示全部楼层
因为一般的 {} 后面都是没有分号的嘛,例如:
if (xxx)
{


}

所以 struct 后面我就下意识地把分号删去了,杯具~~
struct xxx
{

}
回复 支持 反对

使用道具 举报

发表于 2010-9-25 16:27:06 | 显示全部楼层
7# YaDa

VB更容易使人犯低级错误,比如变量没定义,ReDim的时候写错变量名,你查半天都查不出来……还有某函数的返回值类型修改了,静态检查竟然检查不出类型不匹配,偏要运行的时候才查得出……
回复 支持 反对

使用道具 举报

发表于 2010-9-25 18:58:17 | 显示全部楼层
7# YaDa  

VB更容易使人犯低级错误,比如变量没定义,ReDim的时候写错变量名,你查半天都查不出来……还有某函数的返回值类型修改了,静态检查竟然检查不出类型不匹配,偏要运行的时候才查得出……
acme_pjz 发表于 2010-9-25 16:27


强制声明就可以了,不要用redim来当做声明,用来当成分配即可

int;应该是声明了一个匿名整型变量,会被编译器优化合并掉
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-3-22 03:48

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表