Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Какой смысл арифметических операций с нулем?

2189  1 2 все
AlexNek патриот15.06.23 17:58
AlexNek
15.06.23 17:58 

Выпал в осадок, как увидел что-то подобное

int? test = null;

if(test - 1 != null)

{

....

}

else

{

....

}

Может с одной стороны и хорошо, что разрешили - код проще получается, но с другой выглядит дико.

или нет? return test - 1??0;

#1 
AlexNek патриот15.06.23 19:00
AlexNek
NEW 15.06.23 19:00 
в ответ AlexNek 15.06.23 17:58

название даже придумали Lifted operators, Брр, лишь бы не приснилось

https://learn.microsoft.com/en-us/dotnet/csharp/language-r...


Народ тут и другие перлы публикует

[Test]
public void TestNullOps()
{
    Assert.That(10 / null, Is.Null);
    Assert.That(10 * null, Is.Null);
    Assert.That(10 + null, Is.Null);
    Assert.That(10 - null, Is.Null);
    Assert.That(10 % null, Is.Null);
    Assert.That(null / 10, Is.Null);
    Assert.That(null * 10, Is.Null);
    Assert.That(null + 10, Is.Null);
    Assert.That(null - 10, Is.Null);
    Assert.That(null % 10, Is.Null);

    int zero = 0;
    Assert.That(null / zero, Is.Null);
}
#2 
Murr патриот15.06.23 21:25
Murr
NEW 15.06.23 21:25 
в ответ AlexNek 15.06.23 17:58

Со стороны перегрузки операций смотрел? спок

#3 
AlexNek патриот15.06.23 22:15
AlexNek
NEW 15.06.23 22:15 
в ответ Murr 15.06.23 21:25, Последний раз изменено 15.06.23 22:17 (AlexNek)

Может еще понюхать? Кроме отвращения ничего не вызывает.

Хотя понять как-то можно и можно. Если один из операндов нулл то и результат также нулл, может быть удобно для математиков, но смысл то в чём?

if(a - 1 == null) шок

if(a/0 == null) - вообще ляпота

#4 
uscheswoi_82 коренной житель18.06.23 13:30
uscheswoi_82
NEW 18.06.23 13:30 
в ответ AlexNek 15.06.23 17:58

Это чтобы имхо try-catch блок не ставить, если будет null, то вернёт имхо пустоту.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#5 
AlexNek патриот18.06.23 13:47
AlexNek
NEW 18.06.23 13:47 
в ответ uscheswoi_82 18.06.23 13:30

ну так и говорю, техническую сторону понять еще как то можно.

Хотя, похоже больше ничем и не руководствовались.

#6 
AlexNek патриот18.06.23 20:05
AlexNek
NEW 18.06.23 20:05 
в ответ AlexNek 18.06.23 13:47

Похоже нашлось

http://zuga.net/articles/cs-what-are-lifted-operators/


  int? ten = 10;
  int? twenty = 20;
  // result.Value is 30
  int? result = ten + twenty;

Without lifted operators, the compiler would report:
Error CS0019 Operator '+' cannot be applied to operands of type 'Nullable<int>' and 'Nullable<int>'.


Но проблемы доставляют

https://mfranc.com/blog/something-null-is-false-c-and-lift...


if (data.CreateDate => this.LastUpdateDate)
{
     DoSomething();
}
#7 
hbrenner гость16.08.23 13:32
hbrenner
NEW 16.08.23 13:32 
в ответ AlexNek 15.06.23 17:58
int? test = null;
test++;

Глупый, наверное вопрос - почему нету compile-time warning? Понятно-ж, что test == null !?

И, к-тому-же - test послк инкремента все-равно - null

#8 
AlexNek патриот16.08.23 17:30
AlexNek
NEW 16.08.23 17:30 
в ответ hbrenner 16.08.23 13:32

Ну из той же оперы. Проблема в том, что мы и компилятор видим код по разному.

Компилятор видит так и поэтому никаких проблем нет

Nullable<int> num = null;

Nullable<int> num2 = (num.HasValue ? new Nullable<int>(num.GetValueOrDefault() + 1) : null);

#9 
Grossmutters_G прохожий18.08.23 10:40
NEW 18.08.23 10:40 
в ответ AlexNek 15.06.23 17:58
Выпал в осадок, как увидел что-то подобное
int? test = null;
if(test - 1 != null)
{
....
}
else
{
....
}
Может с одной стороны и хорошо, что разрешили - код проще получается, но с другой выглядит дико.
или нет? return test - 1??0;

Ну, например, вы обрабатываете какой-нибудь большой json. В качестве результата может получится другой json, у которого будут поля, вычисленные на основе базовых скалярных (из оригинального json-а).
Резонно предположить, что без liffted операций пришлось бы сильно усложнить код (проверки на null, try/catch и еще что-нибудь такое). Он стал бы более подвержен ошибкам, более дорогим в тестировании. А так - чистый профит :-) А на синтетических примерах пользу увидеть сложно.

#10 
uscheswoi_82 коренной житель18.08.23 15:42
uscheswoi_82
NEW 18.08.23 15:42 
в ответ AlexNek 18.06.23 20:05
Error CS0019 Operator '+' cannot be applied to operands of type 'Nullable<int>' and 'Nullable<int>'.

А вы попробуйте Int32 вместо int, int - это же базовый тип, имхо int не может быть null, а Int32 или Int64 могут быть null. Я всегда когда играюсь в программирование использую только Int32, ну или очень очень редко Int64. В Java я тоже использую Integer. Особенно когда работают с базами данных там используют Int32 вместо int.

Я предпологаю (моё личное предположение) что:

int? переменная;


это тоже самое что:

результат = переменная == null ? 0 : переменная;
// или
результат = переменная == null ? "" : переменная;
кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#11 
uscheswoi_82 коренной житель18.08.23 15:47
uscheswoi_82
NEW 18.08.23 15:47 
в ответ uscheswoi_82 18.08.23 15:42

Вот пишу так:

using System;
public class Program
{
 public static void Main()
 {
       int a = null;        
 }
}


А компилятор даёт ошибку:

Compilation error (line 7, col 16): Cannot convert null to 'int' because it is a non-nullable value type
кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#12 
uscheswoi_82 коренной житель18.08.23 16:46
uscheswoi_82
NEW 18.08.23 16:46 
в ответ uscheswoi_82 18.08.23 15:47

Хотя Int32 тоже даёт ошибку, странно...

В Java если напишишь так:

int a = null;

то компилятор даст ошибку.


А если напишишь так, то никакой ошибки не будет:

Integer a = null;
кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#13 
AlexNek патриот18.08.23 17:20
AlexNek
NEW 18.08.23 17:20 
в ответ uscheswoi_82 18.08.23 15:42

Мне кажется вы пытаетесь смешивать что-то разное

Вот всё описано

https://learn.microsoft.com/en-us/dotnet/csharp/language-r...

https://learn.microsoft.com/en-us/dotnet/csharp/language-r...

https://learn.microsoft.com/en-us/dotnet/standard/numerics

#14 
AlexNek патриот18.08.23 17:24
AlexNek
NEW 18.08.23 17:24 
в ответ uscheswoi_82 18.08.23 16:46

никогда с Явой не работал, но похоже всё правильно

https://www.theserverside.com/blog/Coffee-Talk-Java-News-S...

#15 
Срыв покровов патриот18.08.23 21:09
NEW 18.08.23 21:09 
в ответ uscheswoi_82 18.08.23 15:42
Int32 вместо int

Это одни и то же

#16 
uscheswoi_82 коренной житель18.08.23 21:28
uscheswoi_82
NEW 18.08.23 21:28 
в ответ Срыв покровов 18.08.23 21:09
Это одни и то же

Я спросил на ответах см. https://otvet.mail.ru/answer/2037969726 цитирую:

И еще такой момент. В C# по-хорошему никаких примитивных типов нет. Любая переменная - это объект. Там просто компилятор делает финт ушами и в зависимости от контекста рассматривает ее то как примитив, то как объект.
кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#17 
Программист коренной житель18.08.23 23:58
NEW 18.08.23 23:58 
в ответ uscheswoi_82 18.08.23 15:42
а Int32 или Int64 могут быть null.

Не могут. Int32, rfr b Int64 - структуры. Знаешь чем отличается структура от класса?

#18 
uscheswoi_82 коренной житель19.08.23 19:10
uscheswoi_82
NEW 19.08.23 19:10 
в ответ Программист 18.08.23 23:58
Не могут. Int32, rfr b Int64 - структуры. Знаешь чем отличается структура от класса?
  1. Ну в Си знаю... В Си структура содержит только переменные, а в классе есть кроме переменных ещё методы. В Си я часто использовал структуру. Про оператор ? я узнал, когда мне родители подарили Mac Mini, в Objective-C там тоже есть оператор ?. И отец начал недавно пользоваться этим оператором. Раньше отец ничего этого толком не знал, и всё равно с каждой проданой программы отец получал 1000$. Это я ему рассказал недавно.
  2. Вообще я теорию не учу, а перехожу сразу на практику, и всё изучаю методом тыка, или смотрю ютуб уроки, если книги читаю, то я смотрю только пример кода, из-за дислексии мне очень трудно читать книжки. Программировать я начал в 9-10 лет, потому-что папа программировал дома, я программировал на GW-Basic и Turbo C 1.0, изучал методом тыка. В 1998 папа купил Visual Basic 6.0, и я изучал его методом тыка, и смотрел примеры в MSDN. В 2000 когда я поступил в колледж учил Pascal.
  3. Просто мой папа и врач психиатр запрещают мне заниматься программированием. Отец хочет чтобы я HTML и CSS учил, а врач психиатр не хочет чтобы я что-то учил. Отец хочет чтобы я HTML и CSS учил, потому-что он хочет передать свою программу мне.
  4. В колледже когда я учился, учителя критиковали и ругали продукты Microsoft. Допустим когда мы ехали на IT выставку в г. Мюнхен, нам учитель сказал, кто пойдёт на стенд Microsoft, тот получит плохую оценку.
  5. Когда я в колледже изучал ASP NET во время других занятий, над мной смеялся весь класс, дело в том, что мне папа на день рождения подарил хостинг с ASP.NET 2.0, поэтому я ASP NET изучал.
  6. Мой отец не любит продукцию Microsoft, потому-что после того как вышла Windows 7 нельзя запускать приложения написанные на Visual Basic 6.0
  7. Иногда я выдумываю из головы, моя мама тоже так часто делает. Моя мама хоть с высшим образованием она биолог, биофизик, биохимик, и биоинформатик и у неё докторская степень. Когда я рассказываю в интернете что моя мама сказала, над мной все смеются.
  8. Бывший одноклассник из колледжа (он родом из Казахстана) до сих пор не знает что такое Primary Key и Foreign Key а работает в IT фирме.
  9. Мои родители, которые не профи в IT в сумме получают 6 тыщ евро ежемесячно, и они смогли заработать денег на 2 трёхкомнатные квартиры в Германии, и мама собирается купить ещё новый БМВ или новую Ауди. Допустим мама знает только PyMOL, Rasmol, JMol а больше она ничего не знает, ну ещё Microsoft Office знает, умеет в Word-е статьи писать. И я маму научил пользоваться смартфонами, моя мама не в состояние изучить iPhone или Android, я её учил куда тыкать, опять же я этому научился методом тыка. А папа может программировать, но не разбирается толком в операционных системах и в программах.
  10. То что я методом тыка осваю, я делюсь в своём форуме, так-же в своём форуме пишу что уже знал - https://programming.mybb.ru/ а так-же в своей группе - https://groups.germany.ru/1299414/f/40315715.html?Cat=&pag... и https://groups.germany.ru/1299414/f/40378963.html?Cat=&pag...
  11. У папы сломался компьютер, а я не пользовался ноутбуком, который мне в 2017 году подарили, он 2 года лежал пылился, т.к. у меня в сумме 3 компьютера 2 ноутбука и Mac Mini. Когда я последний раз включал ноутбук я поставил Visual Studio 202x. Как куплю новый ноутбук, так и начну изучать современную версию C#.
  12. Когда психиатру или медбрату хвастаюсь что что-то новое изучил, они очень недовольны чем я занимаюсь, и пытаются на завод отправить работать или в центр инвалидов пытаются запихать. Иногда когда занимаюсь чем заниматься нельзя, у меня щёки раздуваются.
  13. В последнее время у меня апатия, и я уже серьёзно давно не программировал. В 2019 году написал соцсеть за 4 месяца на PHP.


PS. Хоть над моей мамой смеются, когда я что-то в интернете пишу что она сказала, но она получила докторскую степень в Германии, и получает 5 тыщ евро в месяц. Просто она любит говорить в чём она сама не разбирается, ей верят, а иногда не верят. Я повторяю её слова пишу в интернете и народ смеётся. Допустим моя мама раньше говорила всем родственникам что она богатая, но нам она не говорила сколько у неё денег на счету, и папа и я смеялись, а потом когда она купила квартиру 3х комнатную мы перестали смеятся, у неё вообще золотая банковская карточка, и когда мама расплачивается в магазине по золотой карточки, ей чуть ли не в ноги кланятся кассиры.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#19 
uscheswoi_82 коренной житель19.08.23 19:13
uscheswoi_82
NEW 19.08.23 19:13 
в ответ uscheswoi_82 19.08.23 19:10

Опечатка:

В 2000 когда я поступил в университет колледж учил Pascal.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#20 
1 2 все