Loading...
NikolayLiubomirov avatar NikolayLiubomirov 82 Точки

[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 416 Точки

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

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

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

като напишеш 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 82 Точки

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

0
04/06/2017 22:18:48
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.