Java x=x+1; x=x-1; itp


(Kozielartur) #1

Cześć wszystkim czytającym

W kodzie Javy często pokazuje się właśnie takie równanie x=x-1; lub x=x+1; i wiele podobnych o innym symbolu jak x, z książki wychodzi,że stosuję się takie równania po to by instrukcja była odtwarzana w nieskończoność np. w kodzi poniżej :

  • int x=4;

while (x>3) {

// kod pętli zostanie wykonany gdyż x = 4 i jest większe od 3, to jest proste ale,

x=x+1; //Pętla będzie wykonywana w nieskończoność ???

Instrukcja mówi sama za siebie ale jak mam rozumieć, że będzie wykonywana w nie skończoność..Po skompilowaniu tylko raz jest wyświetlana taka instrukcja, a później jest koniec więc nie wiem po co tak dokładnie to równanie istnieje...Miałem kod do zrobienia i nie wiedziałem jak go złożyć tylko przez to,że wymagał użycia podobnego równania x=x+1;

Dzięki za odpowiedź...Artur Gdynia


(floyd) #2

Instrukcja typu: x=x+1 to instrukcja podstawiania stosowana chyba we wszystkich językach programowania. Jeżeli przed pętlą podstawimy x=4 to po wykonaniu w pętli instrukcji x=x+1, x przyjmie wartość 5 (do liczby 4 dodane zostanie 1 i liczba x zmieni swoją wartość na liczbę 5 ) w następnym kroku x będzie już liczbą 6 itd.

Jeżeli mamy pętlę while (x>3) to znaczy że ma być ona wykonywana gdy spełniony jest warunek x>3 czyli będzie wykonywana w nieskończoność bo nowe wartości x po dodaniu do poprzedniej wartości liczby 1 będą spełniać ten warunek.

Gdyby instrukcja w pętli była np. taka:x=x-1 to pętla była by wykonana tylko raz bo po pierwszym wykonaniu instrukcji x=x-1 liczba x przyjęła by wartość 3 czyli warunek x>3 nie był by już spełniony.

PS.

Ty przypuszczalnie patrzysz na zapis: x=x+1 jak na równanie z lekcji matematyki które oczywiście jest równością sprzeczną. Tu oczywiście ten zapis nie oznacza równania tylko instrukcję podstawiania, ale dla początkujących mylący jest ten znak równości. W niektórych językach programowania używa się np. zapisu: x:=x+1 i wówczas już nie ma takich wątpliwości.


(Marcin E Pc) #3

Dokładnie tak jak kolega wyżej pisał. Można też stosować zapis:

x +=1; // inkrementacja czyli dodanie 1 czyli i++

x -=1; //deinkrementacja czyli odjęcie 1 i--

Pozdrawiam


(Damgora) #4

to drugie to raczej dekrementacja... (choć może obie nazwy są poprawne?)

jest jeszcze jeden szczegół: ++i przypisze i jej wartość powiększoną o 1 i taką zwróci, natomiast i++ zwróci wartość i sprzed zmiany


(floyd) #5

Krótko mówiąc wszystko jest kwestią przyjętej umowy co dany zapis ma oznaczać. Żeby jeszcze bardziej skomplikować, to zapis x=5 może oznaczać instrukcję podstawiania czyli x zmienia swoją wartość i oznacza teraz liczbę 5, ale w zapisie: if (x=5) jest instrukcją porównania czyli następuje sprawdzenie czy liczba x równa się 5 i x w tym przypadku nie zmienia swej wartości. W niektórych językach dla instrukcji porównania stosuje się też zapis: if (x==5).


(Damgora) #6

mówimy o Javie, więc wprowadzasz niepotrzebne zamieszanie, tym bardziej, że w zapisie warunków dozwolony jest też operator przypisania. Operator przypisania '=', porównania (równości) '=='.


(Kozielartur) #7

Nic nie cieszy jak zrozumieć coś nad czymś się długo siedzi po nocach :slight_smile: Dzięki za odpowiedź...Ale mam taki kod gdzie wartość zmienna int (x>3) i plik klasy moim zdaniem nie powinien wyświetlić ostatniej frazki "Wielkie X" bo x nie jest większe od 3-ech.I teraz nie wiem jak teraz myśli wiersz poleceń.

class Cwiczenia1A {

public static void main(String[] args) {

int x=1;

x=x-1;

while (x==1) {

System.out.println("X jest mniejsze od 10, wiec pokazuje ci ta wiadomosc"); }

if (x>3); {

System.out.println("Wielkie X"); }

}

}

Dzięki za odpowiedźi....Artur


(Marcin E Pc) #8

Zwróć uwagę na średnik, który znajduje się po if. Nie powinno go tam być, ponieważ występuje po nim blok kodu do wykonania. Poprawnie:

class Cwiczenia1A {

public static void main(String[] args)

{

	int x=1;

	x=x-1;

	while (x==1) 

		{

			System.out.println("X jest mniejsze od 10, wiec pokazuje ci ta wiadomosc"); 

		}

	if (x>3)

	{

		System.out.println("Wielkie X"); 

	}

}

}

W tym wypadku gdy wykonujesz tylko jedną operację po instrukcji warunkowej poprawny będzie zapis:

if (x>3)

		System.out.println("Wielkie X");

Pozdrawiam PS. Ten while nie ma tu żadnego sensu. Wykonuje on pętle, aż x nie osiągnie wartości 1. Możesz zobaczyć:

class Cwiczenia1A {

public static void main(String[] args)

{

	int x=10;

	while (x==1) 

		{

			System.out.println("X jest mniejsze od 10, wiec pokazuje ci ta wiadomosc"); 

                                          x--;

		}

	if (x>3)

	{

		System.out.println("Wielkie X"); 

	}

}

}

(Damgora) #9

Bzdura! Zarówno w poprzednim przykładzie, jak i tym pętla nie wykona się ani razu! Ta pętla będzie się wykonywać dopóki x==1


(somekind) #10

W którym języku tak jest?

Warto zauważyć, że te "niektóre", to większość stosowanych obecnie.

@down - faktycznie, zapomniałem o VB. Tragedia.


(floyd) #11

Bardzo słuszna i cenna uwaga. Moja wina, że tego nie podkreśliłem, ale po prostu chciałem pokazać jak te same zapisy mogą czasami oznaczać różne rzeczy. :slight_smile:

W którym języku tak jest? Np. w tym w którym napisany jest ten programik. :slight_smile:

http://www.sendspace.com/file/o58jyi


(Marcin E Pc) #12

Fakt, moja pomyłka. Pętla będzie wykonywana, aż warunek osiągnie false po czym przejdzie do dalszych instrukcji.Żeby pętla się wykonała, należy postawić znak większości(x>1).