作者qrtt1 (隐者)
看板java
标题Re: [问题] 关於for回圈
时间Fri Jun 2 21:08:05 2006
※ 引述《CMJ0121 (请多指教!!)》之铭言:
: 为什麽第二的回圈
: 他给我的error说
: for(i;i<100;++i)
: ^
: not a statement
: 我在C++可以做的事情
: 再java就不能做了阿!?
: 这跟java本身有关吗!?
但是严格说起来这麽写没效果:)
qrtt1@ubuntu:~/test$ g++ for.cpp -Wall
for.cpp: In function ‘int main()’:
for.cpp:10: warning:
statement has no effect
qrtt1@ubuntu:~/test$ cat for.cpp
#include<iostream>
using namespace std;
int
main (void)
{
int i = 0;
for (i = 0; i < 100; ++i)
if (i == 3)
break;
for (i;
i < 100; ++i)
cout << "test" << endl;
}
========================================
public class sdfasdf {
public static void main(String[] args) {
int i = 0;
for (i; i < 3; i++) {
i += 4;
}
}
}
Exception in thread "main" java.lang.Error:
Unresolved compilation problem:
Syntax error, insert "AssignmentOperator ArrayInitializer"
to complete ForInit
at sdfasdf.main(sdfasdf.java:4)
(他说可能缺了AssignmentOperator或ArrayInitializer)
==========================================
你可以去翻jls或是找javacc的范本来看,
http://cobase-www.cs.ucla.edu/pub/javacc/java1.4.jj (java1.4的javacc)
for statement
<%
void ForStatement() :
{}
{
"for" "(" [ ForInit() ] ";" [ Expression() ] ";" [ ForUpdate() ] ")"
Statement()
}
%>
找到了for statement需要keyword for和其他3个主要的成份,我们要查的是ForInit()
<%
void ForInit() :
{}
{
LOOKAHEAD( [ "final" ] Type() <IDENTIFIER> )
LocalVariableDeclaration()
|
StatementExpressionList()
}
%>
先不论他是不是final的变数,至少要符何2个条件其中之1,
不是LocalVariableDeclaration()就是StatementExpressionList()
而StatementExpressionList就是一长串的StatementExpression
<%
void StatementExpressionList() :
{}
{
StatementExpression() ( "," StatementExpression() )*
}
%>
那所谓的StatementExpression是什呢?
<%
void StatementExpression() :
/*
* The last expansion of this production accepts more than the legal
* Java expansions for StatementExpression. This expansion does not
* use PostfixExpression for performance reasons.
*/
{}
{
PreIncrementExpression()
|
PreDecrementExpression()
|
PrimaryExpression()
[
"++"
|
"--"
|
AssignmentOperator() Expression()
]
}
%>
就是 foo++ ++foo foo-- --foo之类的东西,
或是PrimaryExpression()、AssignmentOperator() 与 Expression()的组合
PrimaryExpression()简单说就是一种变数,
可能是super.field this.field i j xd orz如此等等
AssignmentOperator()简单说就是有指定变数值功能的运算子
= += /= .....
这现这一条分支就先就此打住...
我们回过头来找一下LocalVariableDeclaration
<%
void LocalVariableDeclaration() :
{}
{
[ "final" ] Type() VariableDeclarator() ( "," VariableDeclarator() )*
}
%>
简而言之,就是int i, String x, Integer u,...这样的型式
这时相信你如果没继续查规则一定会想说
for(i;;)这样不行,那for(int i;;)总可以吧!?
虽然语法上没规定,但在语意上是不ok的,所有的local var必需初始
所以,如果不是当场宣告的,就是一个有=的statement :P
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.59.94.148