Форум

Data.BG Форуми: Прост код който не разбирам - Data.BG Форуми

Прехвърляне към съдържание

Страница 1 от 1
  • Вие не можете да започнете нова тема
  • Вие не може да отговаряте на тази тема

Прост код който не разбирам

#1
Потребителят е неактивен   gringocekcu 

  • Група: Потребители
  • Мнения: 387
  • Регистриран: 03-February 08
  • Репутация: 5
Може ли да ми обясните защо

	int x=10;
		x = x++*++x;
		
		System.out.println(x);


дава резултат 120

Измислих всъщност някаква логика, ако може кажете дали е така:

x= (x++) (стойността на това в скобите е 10 защото първо използва стойността после се добавя едно) *
(x++)(стойността на това в скобите е ++11 защото от предишните скоби е използвано 10 обаче след това се добавя едно, а този път щом е ++11 първо се извършва добавянето на 1 после се подава за умножение)

и се получава x = 10*12

Мнението беше редактирано от gringocekcu: 02.04.15 - 14:18

0

#2
Потребителят е неактивен   brigadier 

  • Група: Потребители
  • Мнения: 1101
  • Регистриран: 25-December 05
  • Репутация: 247
Има някакъв номер с приоритетите - http://introcs.cs.pr...a/11precedence/ и с нарочното слагане на само една променлива. Понеже не знам как се прави дебъг на много операции на 1 ред, пробвах емпирично:

int x=10;
int z=10;
int a=10;
int b=10;
int c = 10;
int d = 10;

int first = x++*++z;
int second = ++a*b++;
c = c++*++c;
d = ++d*d++;

System.out.println("first is " + first);
System.out.println("x is " + x);
System.out.println("z is " + z);
System.out.println("second is " + second);
System.out.println("a is " +a);
System.out.println("b is " + b);
System.out.println("c is " + c);
System.out.println("d is " + d);

Резултатът е:

first is 110
x is 11
z is 11
second is 110
a is 11
b is 11
c is 120
d is 121


Първото си е (z+1) * x ; x+1
Второто (а+1) * b ; b + 1
Третото може да се получи само при 10 х 12, тоест ако първо е (c = c++) , после ++с вече е = (с+1)+1 и се умножава със (с++) , което още си седи на 10
Четвъртото е (11 х 11)
Явно ако постинкрементът има отляво = със същата променлива, се изпълнява първо то. Ако е друга променлива, резултатът е 110, а ако отляво е преинкремент, не сработва първо със = .

P.S - заложих дебъгера да спира при промяна на променлива и се получи последователност:
c : 10 , 11 , 12 , 120
d: 10 , 11 , 121

Мнението беше редактирано от brigadier: 26.04.15 - 19:51

0

#3
Потребителят е неактивен   gringocekcu 

  • Група: Потребители
  • Мнения: 387
  • Регистриран: 03-February 08
  • Репутация: 5
int a = 5;
int b = 4;
System.out.println(a + b); // 9
System.out.println(a + b++); // 9
System.out.println(a + b); // 10
System.out.println(a + (++b)); // 11
System.out.println(a + b); // 11


това пък е от книгата на наков
0

#4
Потребителят е неактивен   brigadier 

  • Група: Потребители
  • Мнения: 1101
  • Регистриран: 25-December 05
  • Репутация: 247
Тука си е ясно, понеже само b се вдига 2 пъти с +1.

Има много по- досадни неща, например от теста от книжката Java SE 7 Programmer Exams 1Z0-804 , дето трябва да го сметнеш наум за минута и половина:

Consider the following program and predict the output:
import java.util.regex.*;
class Test {
public static void main(String[] args) {
String str = "Suneetha N.=9876543210, Pratish Patil=9898989898";
Pattern pattern = Pattern.compile("(\\w+)(\\s\\ w+)(=)(\\d{10})");
Matcher matcher = pattern.matcher(str);
String newStr = matcher.replaceAll("$4:$2,$1");
System.out.println(newStr);
}
}

a) 9876543210: N.,Suneetha, 9898989898: Patil,Pratish
b) Suneetha N.=9876543210, Pratish Patil=9898989898
c) Suneetha N.=9876543210, 9898989898: Patil,Pratish
d) This program throws a runtime exception.
0

#5
Потребителят е неактивен   KondioSavov 

  • Група: Потребители
  • Мнения: 2
  • Регистриран: 21-April 15
  • Репутация: 0
  • Пол:Мъж
  • Град:София

Преглед на мнениеgringocekcu, на 02.04.15 - 14:13, каза:

Може ли да ми обясните защо

	int x=10;
		x = x++*++x;
		
		System.out.println(x);


дава резултат 120

Измислих всъщност някаква логика, ако може кажете дали е така:

x= (x++) (стойността на това в скобите е 10 защото първо използва стойността после се добавя едно) *
(x++)(стойността на това в скобите е ++11 защото от предишните скоби е използвано 10 обаче след това се добавя едно, а този път щом е ++11 първо се извършва добавянето на 1 после се подава за умножение)

и се получава x = 10*12


Простичък код с прост отговор :) аз съм начинаещ наскоро изкарах курс за въведение в Java и там ни обясняваха някакви небивалици примерно че
x = x+1 e същото като x++
обаче дефакто не е изобщо така :) има разлика от небето до земята и тука идва точно тънкоста
Също така ни обясняваха че ако
x = 10

x++ е 10 на този ред и чак на следващият става 11 а то всъшност става точно на същия и точно веднага след плюсовете

 int x = 10;
          System.out.println(x++ +","+ x);

следващия х веднага след инкремента е променен.

и сега в израза

	int x=10;
		x = x++*++x;
		
		System.out.println(x);


С две думи инкремент-а или декремента пост или пред няма значение какъв се прибава все едно на ум и след това се извършва умножението
докато ако се ползва ушким аналог-а

x = x+1;

нещата седят друго ядче
          int x = 10;
       System.out.println(x+1*1+x);
 


ако ще и примера да е в допълнителни скоби System.out.println((x+1)*(1+x)); не може по никакъв начин да замени инкрементния тип.
0

#6
Потребителят е неактивен   pix3l 

  • Група: Потребители
  • Мнения: 717
  • Регистриран: 31-August 09
  • Репутация: 217
Става така, заради приоритета...
При x++, x се записва като 10 и се повишава в края на логическия ред.

В твоя случай не следва край, а се инициализира нов оператор, при което машината повишава x, но това става след като е инициализиран оператора.
Така че x преди оператора е 10, а след оператора е 11.

И понеже ++x е с по-голям приоритет и се изпълнява на място, x се повишава още веднъж и крайният алгоритъм изглежда така: 10 * 12.
Нито крачка назад - Зад нас е България!
0

#7
Потребителят е неактивен   petko231 

  • Група: Потребители
  • Мнения: 173
  • Регистриран: 15-August 15
  • Репутация: 52
  • Пол:Мъж
  • Град:Враца
При х++ стойността, която се взима в израза е 10, след което се инкрементира с 1, тоест става 11
++х пък от своя страна първо увеличава стойността, и я взимаш увеличена затова става 10*12 = 120
0

Споделете тази тема чрез:


Страница 1 от 1
  • Вие не можете да започнете нова тема
  • Вие не може да отговаряте на тази тема

1 потребители четат тази тема
0 регистрирани потребители, 1 гости и 0 анонимни потребители


Data.BG e форум за дискусии. Data.BG не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Data.BG.

Close  Member Login