3

Ruby a une initialisation conditionnelle. Apparemment, Java ne le fait pas ou le fait? J'essaye d'écrire plus succintement, pour limiter la portée la plus petite possible.Java: initialisation conditionnelle?

import java.io.*; 
import java.util.*; 

public class InitFor{ 

     public static void main(String[] args){ 
       for(int i=7,k=999;i+((String h="hello").size())<10;i++){} 

       System.out.println("It should be: hello = "+h); 

     } 
} 

erreurs

Press ENTER or type command to continue 
InitFor.java:8: ')' expected 
    for(int i=7,k=999;i+((String h="hello").size())<10;i++){} 
          ^

Puzzles

  1. Est-il possible d'attribuer une valeur à une valeur déclarée en boucle while? OUI code1
  2. Affectation dans la boucle for-conditionnelle? OUI code2
  3. conditionnelle initialisation NO
  4. Pouvez-vous attribuer différents types de valeurs dans les boucles? OUI dans une réponse
  5. Une règle d'initialisation à l'intérieur des boucles? Déclarez à l'extérieur pour accéder aux valeurs plus tard, qu'en est-il de init?

1. CODE

import java.io.*; 
import java.util.*; 

public class InitFor{ 
     public static void main(String[] args){ 
       int k=5; 
       while((k=(k%3)+1)!=1){ 
         System.out.println(k); 
       } 
       //PRINTs only 3 
     } 
} 

2. CODE

import java.io.*; 
import java.util.*; 

public class InitFor{ 

     public static void main(String[] args){ 
       int k=5; 
       for(;(k=(k%3)+1)!=1;){ 
         System.out.println(k); 
       } 
       //PRINTs only 3 
       System.out.println(k); 
       // WHY DOES IT PRINT 1? Assign in for-loop! 
     } 
} 

Une partie du problème original avec beaucoup de différents types de missions et initialisations (?) - - 100 lignes de code dans une ligne

for(int t=0,size=(File[] fs=((File f=f.getParentFile()).listFiles(filt))).size();fs==null;t++){if(t>maxDepth){throw new Exception("No dir to read");}} 
+0

Qu'est-ce que vous essayez d'accomplir? –

+0

@MAS Il devrait imprimer "Il devrait être: bonjour = bonjour", en supposant que l'erreur n'existait pas. –

Répondre

1

Je pense que vous confondez affectation avec déclaration.Vous pouvez faire

public static void main(String[] args){ 
    String h = null; 
    for(int i=7,k=999;i+((h="hello").size())<10;i++){} 

    System.out.println("It should be: hello = "+h); 
} 

l'opérateur s 'de = est droit associatif et définit le premier argument au second argument et évalue le premier argument, donc quelque chose comme

a = b = c = 4 

est le même que

(a = (b = (c = 4))) 

qui fixe c à 4, b à c (aujourd'hui 4) et a à b (maintenant 4)

votre o ligne ne code pourrait être (reformaté pour plus de clarté)

File[] fs=null;                    
File f= ??? ; //you never initialize f in the for loop, you need a starting value 
int t, size;                    

for (t=0,size=(fs=((f=f.getParentFile()).listFiles(filt))).size();  
    fs==null;                    
    t++) { 
     if(t>maxDepth) {throw new Exception("No dir to read");} 
    } 
} 

EDIT - (bien que ce soit le code vraiment laid et si vous avez coché dans mon projet je serais vous dire de le réécrire dès que possible)

+0

KEY: affectation VS déclaration: déclaration impossible alors j'ai besoin de "vars fictifs", sucre syntaxique, à déclarer en premier. Ensuite, je peux créer des assignmes. Accepté. – hhh

+0

note de côté, je pense qu'il est plus sûr d'initialiser avant les boucles. La chaîne ne fait pas que "File []" semble donner l'erreur avec la valeur unitialized dans la boucle for qui essaye l'assignation. – hhh

2

Les déclarations de variables ne peuvent pas être des parties d'expressions, ce sont des instructions, comme le Java spec said so.

Si l'initialisation conditionnelle existait en Java, alors comment déterminer si une variable est initialisée? Comment compiler le code correctement? (vous devez comprendre comment fonctionne le compilateur Java pour savoir qu'il est impossible) Comment sont gérées les erreurs? Il y a beaucoup de complications. Dans votre code, même si la variable est initialisée, elle sera supprimée après le bloc for en raison de la stratégie de portée de Java.

5

Le problème est qu'une variable ne peut pas être déclarée là; les variables peuvent être déclarées dans un bloc, mais ne peuvent pas être déclarées comme faisant partie d'une expression. Cependant, vous pouvez attribuer des objets dans une expression:

for(int i=7,k=999;i+((new String("hello")).length())<10;i++){} 

Pour votre programme, ce qui suit serait plus logique:

public static void main(String[] args){ 
    String h = "hello"; 
    for(int i=7,k=999;(i+h.length())<10;i++){} // not sure what this is doing 
    System.out.println("It should be: hello = "+h); 
} 

Je voudrais aussi ajouter que même si une déclaration a été autorisée que lorsque vous l'aviez , la variable appartiendrait à la portée de la boucle for, et donc la variable ne serait plus visible après la boucle (hors de la portée).

0

Java initialisation conditionnelle:

variable = (condition ? expression1 : expression2); 

Par exemple:

int max = (faces.length>curves.length ? faces.length : curves.length);