Професионална програма
Loading...
+ Нов въпрос
NikolayLiubomirov avatar NikolayLiubomirov 81 Точки

[Programming Fundamentals] 3. Water Overflow

Случи ми се нещо много странно, докато решавах 3. Water Overflow (линк към Judge).

Събирах две short променливи в друг short, когато получих компилационна грешка.

Ето "некомпилиращият" се код:

short n = short.Parse(Console.ReadLine());

short capacity = 255;
short capacityLeft = capacity;

for (short i = 0; i < n; i++)
{
    short litersToPour = short.Parse(Console.ReadLine());

    if (capacityLeft - litersToPour >= 0)
    {
        capacityLeft -= litersToPour;
    }
    else
    {
        Console.WriteLine("Insufficient capacity!");
    }
}

short filled = capacity - capacityLeft;
Console.WriteLine(filled);

Реда, който гърми е:

short filled = capacity - capacityLeft;

Грешката, която ми дава е, че пропускам cast от int към short, при положение, че и двете променливи, които събирам са от тип short

Разбира се, никакъв проблем да сложа един cast:

short filled = (short)(capacity - capacityLeft);

Но първо искам да разбера, защо се получава това недоразумение за мен. Възможно е аз да пропускам нещо простичко, но благодаря предварително за помощта smiley 

Тагове:
0
Programming Fundamentals 05/06/2017 21:11:49
KrasiyMihajlov avatar KrasiyMihajlov 139 Точки
Best Answer

Получава се така, защото аритметичният израз от дясната страна на "=" в C# взима стойност int по default. Просто са преценили че int е достатъчно голям  за да няма загуба на данни. Ако искаш да ползваш каквато и да е променлива по малка от 32 bit-a(short, sbyte, byte i т.н), трябва изрично да я кастваш иначе компилатора, ще ти дава грешка.

2
AlucardDracula avatar AlucardDracula 404 Точки

кастването важи и за над 32 битови числа!

ако кажем long number = 1; 1 все още си е int, а най-лесния да го направил лонг е long number = 1L

1
04/06/2017 21:45:31
AlucardDracula avatar AlucardDracula 404 Точки

като напишеш short capacity = 255; , 255 не е short, a int. Зада го оправиш просто направи така : short capacity = (short)255; (кастване)

има и други варианти като short capacity = Convert.ToInt16("255");  или short capacity = short.Parse("255");

0
28/07/2017 23:03:42
NikolayLiubomirov avatar NikolayLiubomirov 81 Точки

Ще се радвам следващият път, когато дадете downvote no, да го подкрепите с аргументация! Смятам, че темата е полезна и беше добре да се разясни този случай.

0
04/06/2017 22:18:48