Что произойдет, если передать строку вместо числа в функцию, ожидающую числовой аргумент?

Ответ

Результат зависит от языка программирования и контекста. Вот основные сценарии:

  1. Языки со строгой статической типизацией (Java, C#, TypeScript, Go): Код не скомпилируется. Компилятор выдаст ошибку о несоответствии типов.

    function add(a: number, b: number): number {
        return a + b;
    }
    add(5, "10"); // Ошибка компиляции: Argument of type 'string' is not assignable to parameter of type 'number'.
  2. Языки с динамической типизацией (JavaScript, Python, PHP): Поведение определяется во время выполнения и может привести к:

    • Неявному преобразованию типов (coercion): Язык попытается преобразовать строку в число. Если строка содержит только цифры, операция может выполниться. Если нет — результатом будет NaN (в JS) или будет выброшено исключение.
      // JavaScript
      console.log(10 + "5");    // "105" (конкатенация, т.к. оператор +)
      console.log(10 - "5");    // 5 (строковое "5" преобразовано в число 5)
      console.log(10 - "abc");  // NaN (Not a Number)
      # Python
      print(10 + int("5"))  # 15 (явное преобразование)
      print(10 + "5")       # TypeError: unsupported operand type(s) for +: 'int' and 'str'
    • Исключению (Runtime Error): Во многих случаях язык не будет пытаться угадать намерение и выбросит исключение.
      def divide(a, b):
          return a / b
      divide("10", 2)  # TypeError: unsupported operand type(s) for /: 'str' and 'int'
  3. В контексте тестирования: Это классический пример позитивного и негативного тестирования.

    • Позитивный тест: Проверяет, что функция корректно работает с числами 10 и 5.
    • Негативный тест: Проверяет, как система обрабатывает некорректный ввод, например, строку "abc". Ожидаемый результат — понятное сообщение об ошибке или исключение, а не падение всей системы.

Рекомендация для разработчиков: Всегда выполняйте валидацию и приведение типов на границах ввода (UI, API). Используйте строгую типизацию (TypeScript для JS) и явные проверки, чтобы избежать неожиданного поведения.

    // Защитный код в JavaScript/TypeScript
    function safeAdd(a, b) {
        const numA = Number(a);
        const numB = Number(b);

        if (isNaN(numA) || isNaN(numB)) {
            throw new Error('Both arguments must be valid numbers');
        }
        return numA + numB;
    }

Ответ 18+ 🔞

А, вот ты где, мой маленький баг-провокатор! Сидишь и думаешь: «А что будет, если я, такой остроумный, передам в функцию сложения чисел вместо цифры строку "abc"?». Ну, чувак, ответ — «зависит от того, на каком языке ты это вытворяешь, и какого именно пиздеца ты хочешь добиться».

Смотри сюда, разберём по полочкам, как в разных мирах программирования реагируют на эту хуйню.

1. Мир строгих зануд (Java, C#, TypeScript, Go) Тут твоя затея накрывается медным тазом ещё до того, как программа запустится. Компилятор — он как строгий отец, который сразу видит, что ты несёшь дичь. Он посмотрит на твой код, хмыкнет и скажет: «Нет, сынок, так не пойдёт. Ты мне число обещал, а подсовываешь какую-то строку. Иди, переделывай». И всё, приехали. Код просто не соберётся.

function add(a: number, b: number): number {
    return a + b;
}
add(5, "10"); // Компилятор орёт: "Аргумент типа 'string' нельзя присвоить параметру типа 'number'! Иди нахуй!"

2. Мир бесшабашных импровизаторов (JavaScript, Python, PHP) А вот тут начинается цирк, блядь. Никто заранее не проверит. Всё решится в момент выполнения, и результат может тебя оху... то есть, сильно удивить.

  • JavaScript: Этот язык — тот ещё извращенец. Он попытается сделать хоть что-то, даже из явного говна.
    console.log(10 + "5");    // Выдаст "105". Потому что плюс — он и конкатенатор строк тоже. Логика? Её тут нет.
    console.log(10 - "5");    // Выдаст 5. Строку "5" он таки превратил в число. Уже лучше.
    console.log(10 - "abc");  // Выдаст NaN (Not a Number). Ну, типа, «я пытался, но нихуя не вышло».
  • Python: Он поумнее будет. Меньше додумывает за тебя.
    print(10 + int("5"))  # 15. Но только если ты явно сказал превратить строку в число.
    print(10 + "5")       # Сразу орёт: "TypeError! Я не буду это делать, идиот!"

3. А если с точки зрения тестирования? Так это же золотая жила для тестировщика, ёпта!

  • Позитивный тест: Дал числа 10 и 5 — получил 15. Всё ок, можно идти пить чай.
  • Негативный тест (то, что ты и предлагаешь): Дал число 10 и строку "abc". Цель — не сломать всё к хуям, а проверить, как система скажет «нет». Ожидаешь вменяемую ошибку, а не чтобы сервер лег с криком «ядра — чистый изумруд!».

Так что же делать, чтобы не облажаться? А вот, блядь, главный совет, который все пропускают мимо ушей, а потом удивляются, почему всё падает. Проверяй и преобразовывай данные на входе, мудак!

Не надейся на авось. Явно скажи, что ты хочешь.

// Правильный, не распиздяйский подход
function safeAdd(a, b) {
    const numA = Number(a);
    const numB = Number(b);

    // Проверка, а не насовали ли нам хуйни вместо чисел
    if (isNaN(numA) || isNaN(numB)) {
        throw new Error('Оба аргумента должны быть нормальными числами, а не вот этим вот всем!');
    }
    return numA + numB;
}

Вот и весь сказ. Хочешь стабильности — используй строгую типизацию (TypeScript — твой друг) и пиши защитный код. Хочешь сюрпризов — работай с чистым JS и угадывай, что там вылезет в консоли. Выбор за тобой, ебать.