Springen naar inhoud

Chars in java


  • Log in om te kunnen reageren

#1

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 25 augustus 2010 - 18:41

Hoi,

ik heb nog een vraagje:
void charTest(char x, char y) {
// Arithmetic operators:
x = (char)(x * y);
}

Wat doet dit eigenlijk?


Als ik bijvoorbeeld "a" en "b" neem als argumenten, dan zegt Eclipse dat het type ervan String is en niet char...

En vermenigvuldigen van chars lijkt me ook vreemd?

Tenzij ik misschien bijvoorbeeld "3" en "5" invoer?
"C++ : Where friends have access to your private members." — Gavin Russell Baker.

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 25 augustus 2010 - 19:16

Dat maakt van een getal een karakter.


Er zijn twee mogelijke interpretaties mogelijk, afhankelijk van de taal waarin je werkt.
Elk karakter in de PC-wereld heeft een getal. Hiervoor wordt vaak de unicode gehanteerd (java in elk geval wel voor zover ik weet, nl. modified UTF). Hoofdletter A heeft bijv. getal 97. Als jij dus het getal 97 cast naar een char zul jij hoofdletter A krijgen (dit is volgens mij de manier waarop java er mee omgaat).

De ander lijkt me niet zo relevant in deze. Namelijk het omzetten van een getal in een leesbaar getal. Maar volgens mij heb je in java dat je dan moet casten als string.


Het vermenigvuldigen van chars is helemaal niet zo vreemd. In C is een char bijv. gewoon een getaltype. Je kunt deze dan ook laten weergeven als getal, maar daarnaast ook als letter.
Vooral voor het encoderen, comprimeren, etc. is dit een handige manier.

#3

317070

    317070


  • >5k berichten
  • 5567 berichten
  • Moderator

Geplaatst op 25 augustus 2010 - 21:24

Als ik bijvoorbeeld "a" en "b" neem als argumenten, dan zegt Eclipse dat het type ervan String is en niet char...

Probeer eens 'x' en 'y' i.p.v. "x" en "y".

Die eerste zijn chars, die tweede zijn Strings.
What it all comes down to, is that I haven't got it all figured out just yet
And I've got one hand in my pocket and the other one is giving the peace sign
-Alanis Morisette-

#4

317070

    317070


  • >5k berichten
  • 5567 berichten
  • Moderator

Geplaatst op 25 augustus 2010 - 21:31

Maar volgens mij heb je in java dat je dan moet casten als string.

Dat lijkt me niet te kloppen. Getallen zijn geen superklasse van String, en dus gaat casten niet lukken. Ook is String geen primitief datatype. (Het is wel een datatype dat wat meer kan dan alle andere)
Casten als char zou wel lukken.
What it all comes down to, is that I haven't got it all figured out just yet
And I've got one hand in my pocket and the other one is giving the peace sign
-Alanis Morisette-

#5

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 25 augustus 2010 - 22:00

Bedankt, ik had niet gedacht dat '' en "" verschil zou maken. Verwend door php ;)
"C++ : Where friends have access to your private members." — Gavin Russell Baker.

#6

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 25 augustus 2010 - 22:05

Getallen zijn geen superklasse van String, en dus gaat casten niet lukken.

Ok, zou heel goed kunnen ;). Ik praat vanuit de C-, PHP- en VB.NET-wereld. Daar is alles net iets anders dan in Java. En ik zou weer moeite moeten doen om java volledig te snappen.

Zie hier overigens nog wel iets over casten in Java: http://www.michael-t...P_DataTypes.htm. Daar zie je ook duidelijk dat casten van een char naar bijv. int heel normaal is (is veel meer over te vinden overigens, maar deze kwam mij even goed uit vanwege het voorbeeld).

#7

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 25 augustus 2010 - 22:26

Ja, het voorbeeld is illustratief ;)

Dank je!
"C++ : Where friends have access to your private members." — Gavin Russell Baker.

#8

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 31 augustus 2010 - 19:10

import java.util.*;
import static net.mindview.util.Print.*;
public class VowelsAndConsonants {
public static void main(String[] args) {
Random rand = new Random(47);
for(int i = 0; i < 100; i++) {
int c = rand.nextInt(26) + ‘a’;
printnb((char)c + ", " + c + ": ");
switch(c) {
case ‘a’:
case ‘e’:
case ‘i’:
case ‘o’:
case ‘u’: print("vowel");
break;
case ‘y’:
case ‘w’: print("Sometimes a vowel");
break;
default: print("consonant");
}
}
}
}

Hier zit ik toch op vast hoor ;)

Ik dacht dat switch een integer wilde, en geen char?

Eclipse wil trouwens ook niet compilen...


Kan iemand me helpen alstublieft?

EDIT: voor de duidelijkheid: daarom verwachtte ik bij case ook geen '-tekentjes...
owel had ik bij int c een sommatie met a en niet met 'a' verwacht...

Veranderd door In fysics I trust, 31 augustus 2010 - 19:20

"C++ : Where friends have access to your private members." — Gavin Russell Baker.

#9

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 31 augustus 2010 - 19:29

Wellicht even wat meer inspringen. Ik ga niet door code heen werken die allemaal niet netjes geformatteerd is. Hoe kort het dan ook is...

Switch is geen functie, maar language-construct. Dit heeft dus niets te maken met datatypes. Switch verwacht dus ook niet een specifiek datatype...
Nu vergelijk je overigens wel een integer met een char, is dat nodig...?

#10

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 31 augustus 2010 - 19:35

Sorry de formatting is niet goed gekopieerd :s


The switch statement is a clean way to implement multiway selection (i.e., selecting from
among a number of different execution paths), but it requires a selector that evaluates to an
integral value, such as int or char. If you want to use, for example, a string or a floating

point number as a selector, it won’t work in a switch statement. For non-integral types, you
must use a series of if statements.

//imports
import java.util.*;
import static net.mindview.util.Print.*;

public class VowelsAndConsonants {
   public static void main(String[] args) {
   Random rand = new Random(47);
	   for(int i = 0; i < 100; i++) {
	   int c = rand.nextInt(26) + ‘a’;
	   printnb((char)c + ", " + c + ": ");
		 switch(c) {
		   case ‘a’:
		   case ‘e’:
		   case ‘i’:
		   case ‘o’:
		   case ‘u’: print("vowel");
						break;
		   case ‘y’:
		   case ‘w’: print("Sometimes a vowel");
						 break;
		   default: print("consonant");
		   }
	  }
}

}

Nu vergelijk je overigens wel een integer met een char, is dat nodig...?

Wat bedoel je?

Veranderd door In fysics I trust, 31 augustus 2010 - 19:37

"C++ : Where friends have access to your private members." — Gavin Russell Baker.

#11

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 31 augustus 2010 - 20:06

Werkt het wel als je er gewoon een serie van ifs van maakt?

Daarnaast, waarom niet gewoon zo:

if("aeiou".indexOf(c) <> -1) print("vowel");
elseif("yw".indexOf(c) <> -1) print("Sometimes a vowel");
else print("consonant");

If you want to use, for example, a string or a floating point number as a selector, it wonít work in a switch statement.

Vaag, ken de taal niet. Maar als ik al zoek op `integral types Java` krijg ik ook verschillende antwoorden. Wat dat betreft vaag...

Overigens zijn zowel char als integer integrale datatypen. Zoals al eerder aangegeven: allebei zijn in principe getallen.

#12

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 31 augustus 2010 - 20:26

Ja, ik zou intuÔtief ook een constructie zoals die van jou verkiezen. Ik heb het voorbeeldje uit het handboek daarom gequoted.

En ik begrijp idd zoals je eerder uitlegde dat het beiden integrale typen zijn, maar niet waarom je dan per se de '' gebruikt. Ik dacht dat je daarmee een letter krijgt (die overeenkomt met een integrale waarde).

Ik bedoel dus dat ik gewoon '' verwacht, ofwel:
-zowel binnen switch() als na case, of anders:
-noch binnen switch() noch na case

En niet:

switch( c )
case 'a'
omdat die c een int is en 'a' een char (wegens die expliciete '').

Maar het begint te komen, bedankt.

Veranderd door In fysics I trust, 31 augustus 2010 - 20:27

"C++ : Where friends have access to your private members." — Gavin Russell Baker.

#13

JWvdVeer

    JWvdVeer


  • >1k berichten
  • 1114 berichten
  • Ervaren gebruiker

Geplaatst op 31 augustus 2010 - 20:36

En ik begrijp idd zoals je eerder uitlegde dat het beiden integrale typen zijn, maar niet waarom je dan per se de '' gebruikt. Ik dacht dat je daarmee een letter krijgt (die overeenkomt met een integrale waarde).

Om het verschil uit elkaar te houden tussen string en char. Al vind ik het persoonlijk ook een beetje onzin. Als ik dit doe:

char dag = "a";
Zou het mijns inziens logisch zijn dat de interpreter gelijk herkent: tsjoh, hij wil dat het een char wordt.

Hetzelfde geldt voor:
int dag = 121 + "a";

Maar ja, wij zijn niet degenen die het verzonnen hebben. Wellicht dacht men: door op deze manier scheiding te maken, blijft iedereen een beetje wakker en blijft iedereen doorhebben dat het ťťn in principe een getal is en het ander in principe een lap tekst.


Ik bedoel dus dat ik gewoon '' verwacht, ofwel:
-zowel binnen switch() als na case, of anders:
-noch binnen switch() noch na case

En ik snap niet wat je bedoelt en verwacht dus eigenlijk nog uitleg ;).

Veranderd door JWvdVeer, 31 augustus 2010 - 20:37


#14

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 31 augustus 2010 - 20:43

Waarom er niet staat switch( (char)c ).

Maar ik moet gewoon mijn manier van denken een beetje verruimen. Char is ook een integrale datatype. Dat volstaat eigenlijk als verklaring.

Dank je voor je antwoorden!
"C++ : Where friends have access to your private members." — Gavin Russell Baker.

#15

Glenn3

    Glenn3


  • 0 - 25 berichten
  • 2 berichten
  • Gebruiker

Geplaatst op 12 september 2010 - 00:31

Zelf ken ik nog geen Java (wel C++), maar ik heb even de tijd genomen om het een en ander op te zoeken.

Om terug te komen op je oorspronkelijke vraag. Het schrijven van een expressie als

x = (char)(x * y);

noemt men explicit casting. Dit betekent dat je een entiteit van een bepaald datatype gaat omzetten in het door jou expliciet opgegeven type. Explicit casting is echter niet altijd nodig, vaak doet de compiler voor jou automatisch al een aantal omzettingen. Deze automatische conversies worden impliciete conversies of coercions genoemd.

In jou oorspronkelijk opgegeven code, was de explicit cast niet nodig. De compiler weet wel hoe hij een char maal een char, in een char moet omzetten. Als je een stukje code schrijft als

int i = 5;
int j = 3;
int k;
k = i + j;

dan ga je ook niet schrijven

int i = 5;
int j = 3;
int k;
k = int(i + j);

De compiler weet immers hoe hij hier mee moet omgaan. De compiler kan echter nog meer typeconversies automatisch uitvoeren. Een soort typeconversies dat de compiler bijvoorbeeld ook automatisch kan uitvoeren zijn de 'Widening Primitive Conversion'. Onder deze conversies vallen o.a. het omzetten van:
- een short in een int
- een int in een long
- een char in een int
- een long in een double

Als je wil weten wat er exact allemaal kan, kan je kijken op de site van Sun (zie hier onder puntje 5.1.2).

Je kan dus gerust een stukje code schrijven als

int i = 5;
long j = i;

char c = 'a';
int d = c;

Omgekeerd heb je ook nog de 'Narrowing Primitive Conversions'. Dit is bv. het omzetten van:

- een int in een char
- een long in een int

Voor deze conversies zal je dus een explicit cast moeten doen. Je zal dus bv. moeten schrijven

int i = 5;
char c = (char)i;

long i = 25;
int j = (int)i;

De reden waarom men bij de onderste voorbeelden explicit cast verplicht is gemaakt, is voor je eigen veiligheid. Stel dat je per ongeluk een reeel getal zou toekennen aan een geheel getal. Dan ben je ineens het deel achter de komma kwijt, wat soms niet wenselijk is. Omgekeerd kan het geen kwaad om een geheel getal aan een reeel getal toe te kennen.

Op deze website heb ik nog wat interessante dingen gevonden over het onderwerp. Je kan het eens lezen als je er in geÔnteresseerd mocht zijn ](*,).

Veranderd door Glenn3, 12 september 2010 - 00:35






0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures