Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
4 / 4 / 0
Регистрация: 25.01.2018
Сообщений: 36
1

Для чего нужны суффиксы?

14.02.2018, 20:50. Показов 3861. Ответов 8
Метки нет (Все метки)

Здравствуйте.
Начал изучать программирование практически с нуля, если не считать Бейсик из далеких 80-90х годов.
Не могу понять зачем в C# нужны суффиксы если переменной при объявлении уже присвоен тип (то есть уже выделена память определенного размера)

Поясню на примере:

C#
1
2
3
4
5
long y = 2147483647 + 1;
long z = 2147483647L + 1;
 
Console.WriteLine(y);
Console.WriteLine(z);
Почему этот код не скомпилируется ведь тип переменных уже обьявлен как long ?
В чем смысл присвоения типа переменной если после её значения все равно нужно указывать суффикс ?

То есть почему нельзя делать так:

C#
1
2
3
4
5
y = 2147483647L + 1;
z = 2147483647L + 1;
 
Console.WriteLine(y);
Console.WriteLine(z);
Если вопрос не корректен, прошу сильно не пинать. Яндекс уже задолбася искать ответ на этот вопрос.
Ну уж очень не хочется оставлять былых пятен на начальном уровне изучения.
2

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2018, 20:50
Ответы с готовыми решениями:

Нужны ли суффиксы в значениях переменных
Сабж. В переменной типа long, к примеру, нужно к значению приписывать L? Просто вроде в обоих...

Для чего нужны делегаты
Добрый день. Может кто-нибудь объяснить для чего нужны делегаты и привести пример. Уже кучу книг...

Для чего нужны интерфейсы
Люди уже около полу года проглю на C# и до сих пор не могу понять зачем нужны интерфейсы , где их...

Для чего нужны делегаты?
Никак не могу понять, зачем нужны делегаты. Есть на форуме люди, желающие помочь новичку самоучке...

8
139 / 71 / 26
Регистрация: 29.06.2015
Сообщений: 186
14.02.2018, 21:00 2
Цитата Сообщение от Sanay0102 Посмотреть сообщение
long y = 2147483647 + 1;
Идет переполнение int. Максимальное значение для int равно 2147483647.
2147483647+1 = 2147483648, а это число уже не вмещается в int.
А если суммировать 2147483646 + 1, то все работает.

Если int + int, то результатом будет int, но в даном случае этот int записывается в long. Поетому ему нужно уточнить, что нужно суммировать long и int и тогда результатом будет long.
1
4 / 4 / 0
Регистрация: 25.01.2018
Сообщений: 36
14.02.2018, 21:14  [ТС] 3
Цитата Сообщение от irises Посмотреть сообщение
Идет переполнение int
То что идет переполнение int я понял
Не могу понять почему Y стало int ведь ей же уже присвоен тип long
Получается какой бы тип не был присвоен переменной, если не указать суффикс, переменная становится int ?
Если так, зачем обьявлять переменную определенного типа ?
1
139 / 71 / 26
Регистрация: 29.06.2015
Сообщений: 186
14.02.2018, 21:22 4
Цитата Сообщение от Sanay0102 Посмотреть сообщение
Не могу понять почему Y стало int ведь ей же уже присвоен тип long
Сначала идут вычисления, а потом запись в переменную.
Как думает компилятор: Тааааак, int+int будет int. А теперь этот int запишем в long.

Y не стала int, она все также long.

Цитата Сообщение от Sanay0102 Посмотреть сообщение
Получается какой бы тип не был присвоен переменной, если не указать суффикс, переменная становится int ?
Если работаете в Visual Studio, наведите мышкой на число и увидите какого они типа. Если явно не указывать тип, то целые числа будут типа int.

Цитата Сообщение от Sanay0102 Посмотреть сообщение
Если так, зачем обьявлять переменную определенного типа ?
Повторюсь, если указали тип для Y long, она так и будет long.
3
Эксперт .NET
7573 / 5061 / 1204
Регистрация: 25.05.2015
Сообщений: 15,425
Записей в блоге: 14
14.02.2018, 21:31 5
irises, суффиксы нужны, когда компилятор не может определить подходящий тип переменной, либо по умолчанию определит его не так, как вам надо.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
namespace ConsoleAppSanay0102
{
    class Program
    {
        static void Main(string[] args)
        {
            //int a = 2147483647 + 1; // error CS0220: Переполнение при выполнении операции во время компиляции в режиме проверки.
            //int b = 2147483647L + 1; // error CS0266: Не удается неявно преобразовать тип "long" в "int". Существует явное преобразование (возможно, пропущено приведение типов).
            //var c = 2147483647 + 1; // error CS0220: Переполнение при выполнении операции во время компиляции в режиме проверки.
            var d = 2147483647L + 1; // OK
            //long e = 2147483647 + 1; // error CS0220: Переполнение при выполнении операции во время компиляции в режиме проверки.
            long f = 2147483647L + 1; // OK
 
            //uint g = 2147483647 + 1; // error CS0220: Переполнение при выполнении операции во время компиляции в режиме проверки.
            uint h = 2147483647u + 1; // OK
 
            Func1(1); // Какой из методов будет вызван? И как указать другой метод?
        }
 
        static void Func1(int a)
        {
        }
        static void Func1(long a)
        {
        }
        static void Func1(uint a)
        {
        }
        static void Func1(ulong a)
        {
        }
        static void Func1(double a)
        {
        }
        static void Func1(float a)
        {
        }
    }
}
2
139 / 71 / 26
Регистрация: 29.06.2015
Сообщений: 186
14.02.2018, 22:55 6
Цитата Сообщение от Rius Посмотреть сообщение
суффиксы нужны, когда компилятор не может определить подходящий тип переменной
Например? Что то никогда с таким не сталкивалась.

Добавлено через 11 минут
Цитата Сообщение от Rius Посмотреть сообщение
C#
1
Func1(1); // Какой из методов будет вызван? И как указать другой метод?
Поскольку, 1 это int, то вызовет для int.

Чтоб вызвать другой метод, нужно подсказать какой именно используя суффиксы
C#
1
2
Func1(1L);
Func1(1u);
2
4 / 4 / 0
Регистрация: 25.01.2018
Сообщений: 36
14.02.2018, 23:17  [ТС] 7
Rius, спасибо за наглядный пример.
Поддержу вопрос irises, в каких случаях компилятор может присвоить числу тип не int ?
1
3058 / 2174 / 1077
Регистрация: 14.08.2016
Сообщений: 7,441
15.02.2018, 00:28 8
тогда и только тогда когда он не int(вылезает за размер, имеет дробный разделитель)
1
Эксперт .NET
7573 / 5061 / 1204
Регистрация: 25.05.2015
Сообщений: 15,425
Записей в блоге: 14
15.02.2018, 06:26 9
Цитата Сообщение от Sanay0102 Посмотреть сообщение
Поддержу вопрос irises, в каких случаях компилятор может присвоить числу тип не int ?
Вопрос не в том, когда не int, а когда не тот, что вам подходит/нужен. Новички, не читавшие учебники, спотыкаются на простейшей операции:
C#
1
2
3
double a = (1 / 4) * 8; // == 0
double b = (1d / 4) * 8; // == 2
double c = (1.0 / 4) * 8; // == 2
Добавлено через 2 минуты
Консоль вместо числа выводит 0
Деление, всегда 0 вместо числа с запятой
Почему при делении 1 / 2 получается 0
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2018, 06:26

Для чего нужны делегаты
Форумчане не подскажете где и для чего нужны делегаты? Перечитал много книг ни как не могу догнат?...

Для чего нужны подразрядные операторы
Добрый день, изучаю C# по книге Шилдта. Дошел до главы "Подразрядные операторы" и не совсем понимаю...

Для чего нужны Windows - службы?
Для чего нужны Windows - службы? Ещё 1 тупой вопрос - вот говорят,что C++,C - языки для системного...

Для чего нужны частичные методы?
С частичными классами всё понятно,но зачем нужны частичные методы?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.