Re: [問題] 關於for回圈
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 8 篇):