вопрос о вычитании двух строк в программировании c - PullRequest
0 голосов
/ 02 августа 2020

У меня вопрос из интервью, и мне нужна небольшая помощь:

Что такое «abcd» - «xyz»?

  1. Адрес
  2. Целое число
  3. Операция недопустима для компилятора
  4. str
  5. ничего из вышеперечисленного

Я почти уверен, что это 4. может кто-нибудь сказать мне если это правда и каково правильное объяснение. спасибо!

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Обычно в C разница между двумя указателями - это целое число типа ptrdiff_t, представляющее расстояние между двумя указанными объектами. Это интерпретация, которая применима здесь, потому что строковый литерал является сокращением для массива символов и, как и любой массив, его использование в выражении приводит к «распаду» массива на указатель на его первый элемент.

Однако "abcd" - "xyz" - это неопределенное поведение, поскольку вычитание одного указателя из другого определяется только в том случае, если два указателя относятся к объектам в одном массиве. (В противном случае «расстояние между двумя объектами» не имеет смысла.)

В предложенном множественном выборе не указано «Неопределенное поведение» как вариант. Вариант 3 не будет правильным, если вы не знаете что-то о конкретном компиляторе, о котором идет речь: поскольку стандарт не определяет поведение, компилятор может реализовать все, что он считает нужным. Он может принять выражение и вернуть бессмысленный результат, или он может сгенерировать сообщение об ошибке и прервать компиляцию, или он может сделать что-нибудь еще, что сочтет разумным для автора компилятора.

Итак, если бы мне задали этот вопрос , Я бы получил go за ответ 5 («Ничего из вышеперечисленного») и был бы готов объяснить свои рассуждения.

0 голосов
/ 02 августа 2020

Прежде всего, возьмем пример программы:

#include <stdio.h>

int main(void) {
    char str1[] = "abcd";
    char str2[] = "xyz";

    int x = str1 - str2;

    printf("Subtraction diff: %d\n", x);

    return 0;
}

Вы думаете, что программа вычитает две строки, верно? Но нет!

Программа не вычитает две строки, здесь две char[]. x содержит разность адресов памяти между str1[] и str2[] для представления. Это может быть что угодно. Вышеупомянутая программа отобразит 4, т.е. расстояние между началом первой строки и началом второй в вашем стеке составляет 4 байта.

Связано: В C ++ вы можете воспользоваться помощью ключевого слова auto в этом примере, чтобы компилятор мог выбрать подходящий тип для выражения, например:

auto x = str1 - str2;
std::cout << x;
...