Почему мой C ++ для l oop всегда выполняется, несмотря на то, что его условие не выполняется? - PullRequest
0 голосов
/ 05 апреля 2020

Исходя из Java, я новичок в C ++. Я не могу понять, почему всегда выполняется следующее для l oop, несмотря на то, что начальное значение i превышает n - 1.

    int maxProfit(vector<int>& prices) {
        const int n = prices.size();
        int profit = 0;
        for(size_t i = 0; i < n - 1; i++) {
            cout << "i: " + to_string(i) + ", n - 1: " + to_string(n - 1) + '\n';
            const int diff = prices[i + 1] - prices[i];
            if(diff > 0) { profit += diff; }
        }
        return profit;
    }

Вывод, который я получаю (из-за печати оператор): i: 0, n - 1: -1, за которым следует:

AddressSanitizer:DEADLYSIGNAL
=================================================================
==32==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000004 (pc 0x000000382c25 bp 0x7ffd70e65f70 sp 0x7ffd70e65d00 T0)
==32==The signal is caused by a READ memory access.
==32==Hint: address points to the zero page.
    #3 0x7f6ee7f0682f  (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
AddressSanitizer can not provide additional info.
==32==ABORTING

Возможно, я чего-то не вижу, но может кто-нибудь сказать мне, почему выполняется для l oop, несмотря на условие в для l oop Нарушается?

Я не уверен, что это за версия C ++. Это из онлайн-редактора LeetCode.

1 Ответ

4 голосов
/ 05 апреля 2020

Java не имеет неподписанных типов, но в C ++ есть. Если n == 0, то n - 1 математически -1, но -1 не является значением без знака. В этом случае происходит то, что результат охватывает , а -1 фактически равен максимально возможному значению без знака. Измените ваш код на ожидаемый результат

for(size_t i = 0; i + 1 < n; i++) {

Теперь нет отрицательных чисел.

...