Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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
Java、C和C中循环变量的类型限制++; 为什么java、C++和C++(也许其他语言也)不允许一个以上的循环变量类型?例如: for (int i = 0; i < 15; i++) for (int i = 0, variable = obj.operation(); i < 15; i++) { ... } for (int i = 0, long variable = obj.operation(); i < 15; i++) { ... }_Java_C++_For Loop_Scope_Strong Typing - Fatal编程技术网

Java、C和C中循环变量的类型限制++; 为什么java、C++和C++(也许其他语言也)不允许一个以上的循环变量类型?例如: for (int i = 0; i < 15; i++) for (int i = 0, variable = obj.operation(); i < 15; i++) { ... } for (int i = 0, long variable = obj.operation(); i < 15; i++) { ... }

Java、C和C中循环变量的类型限制++; 为什么java、C++和C++(也许其他语言也)不允许一个以上的循环变量类型?例如: for (int i = 0; i < 15; i++) for (int i = 0, variable = obj.operation(); i < 15; i++) { ... } for (int i = 0, long variable = obj.operation(); i < 15; i++) { ... },java,c++,for-loop,scope,strong-typing,Java,C++,For Loop,Scope,Strong Typing,同样,有人知道为什么会存在这种类型的限制吗?之所以存在这种限制,是因为您的需求非常不寻常,并且可以通过非常类似(而且只是稍微详细一点)的构造获得。如果您确实想这样做,Java支持匿名代码块来限制作用域: public void method(int a) { int outerVar = 4; { long variable = obj.operation(); for (int i = 0; i < 15; i++) { ... } } } public v

同样,有人知道为什么会存在这种类型的限制吗?

之所以存在这种限制,是因为您的需求非常不寻常,并且可以通过非常类似(而且只是稍微详细一点)的构造获得。如果您确实想这样做,Java支持匿名代码块来限制作用域:

public void method(int a) {
  int outerVar = 4;
  {
    long variable = obj.operation();
    for (int i = 0; i < 15; i++) { ... }
  }
}
public void方法(int a){
int-outerVar=4;
{
长变量=对象操作();
对于(int i=0;i<15;i++){…}
}
}

只是猜测-在循环中声明“long variable”非常简单,而且由于Java旨在简化,设计者可能觉得没有必要添加对所需内容的支持。

好吧,语法是(expr;expr;expr)的,不能在一个表达式中声明两个不同类型的变量。因此,它与循环变量没有太大关系。

根据,for语句的初始化可以是一个经过计算和丢弃的语句表达式列表,也可以是一个单变量声明语句。变量声明语句可以声明多个变量,但它们都属于同一类型

所以你可以这样做:

for (int i = 0, variable = obj.operation(); i < 15; i++) { ... }
for(int i=0,variable=obj.operation();i<15;i++){…}

但在这种情况下,变量将被定义为int。

@jsight是正确的,但我认为真正的原因是语法的简单性。假设Java允许在第一个逗号后添加类型或新变量名。由于Java不需要前向声明,逗号后面的标识符可以是一个新变量名,一个以前从未遇到过的类名称的现有类名。现在应该可以解决这个问题了,但是:

  • 它使语法更加复杂,可能是以一种不明显的方式
  • 这使得Java编译器的解析阶段更加复杂
  • 对于处理Java源代码的其他工具来说,它使live变得更加复杂
  • 如果for循环中存在语法错误,则可能会导致更模糊和/或误导性的编译器错误消息
  • (IMO,语法复杂度是C语言的缺点之一,尤其是C++)。我在这两方面都做了大量的编码,但我仍然发现语法错误消息有时难以解码。

    for (int i = 0; i < 15; i++)
    
    for (int i = 0, variable = obj.operation(); i < 15; i++) { ... }
    
    for (int i = 0, long variable = obj.operation(); i < 15; i++) { ... }
    
    这本身就是非法的。逗号不会开始新语句。逗号前后的两部分都是一条语句的一部分。此语句正在声明和初始化
    int
    变量列表。不管怎样,这就是行开头的
    int
    标识符告诉编译器的。逗号后面的
    long
    标识符是错误的,要声明不同类型的变量,必须启动一个新语句


    由于不能在一条语句中声明两种不同类型的变量,因此必须在
    for
    初始值设定项之外声明其中一种。

    这将在每次迭代中确定变量的范围,而不是每次循环。正如Jesse所说,我对循环范围感兴趣。我不想在每次迭代中丢失变量值。不,这在Java中是合法的:for(inti=0,j=5;I