Задачка по с++

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Здравствуйте, решил от делать не чего порешать задачи и методом тыка получил то чего не могу понять как так получилось.
Объясните пожалуйста почему все числа сложились.
Результат >> Three for: 16
C++:
#include <iostream>
using namespace std;
int main()
{
    int m[]={4,3,9};
    int n=3;
    int m2[n];
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
            if(m[i]==m[j]){
                m[j]=m2[i];
                cout<<"Three for: "<<m[i];
            }
        }
        break;
    }
}
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Оу, а задачи то из разряда "кот по клаве пробежал"
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
У меня вообще 0. И это правильный ответ, ибо m2 не инициализирован...
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
У меня вообще 0. И это правильный ответ, ибо m2 не инициализирован...
1621936620438.png
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
@RudikS, компилятор не один существует, не забываем. У меня clang (вроде он по дефолту), без оптимизаций. То есть инициализирует.
Сообщения автоматически склеены:

Да и вообще, переменная сама по себе инициализируется. n = 3. Память выделилась на этапе компиляции. Если через new int[n], тогда будет мусор. А вот почему 16 пишет - для меня будет загадкой.

P.S. Видимо GCC, а не Clang. Пруф на MSVC (Visual Studio):
1621947847564.png
1621947859441.png
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@KiKiEEKi, сделай int m2[] = {0, 0, 0};
Сообщения автоматически склеены:

В плюсах, в отличии от SP, при инициализации переменной, если явно не прописать значение, то будет мусор в значениях (как в старых версиях SP, если используется decl вместо new).
 

DENFER

Пишу плагины за два биг тести и картошку фри..
Сообщения
260
Реакции
289
Боже, мне было так больно смотреть 🥲

В C++ размер массива должен быть известен на этапе компиляции, а потому задается константным выражением, строчка 7 строго настрого должна закрыть ворота для компиляции программы.

Но если сие чудо, действительно, компилируется, то результатом твоей программы будет просто первое число массива m2 (то бишь мусор), либо первое число m1.

Зачем тебе два цикла, если после первого прохода ты завершаешь его? Оставил бы только вложенный.
Если ты дружище, объявил функцию с возвращающим типом, то будь любезен вернуть, что-нибудь.
Сообщения автоматически склеены:

Опять же - не во всех компиляторах. На MSVC - да, мусор закидывает. На GCC видимо инициализирует автоматически.
Совершенно точно, некоторые компиляторы GCC - сами инициализируют неинициализированные переменные.
 
Последнее редактирование:

Kailo

Участник
Сообщения
194
Реакции
896
Начнём с того, что break указан безусловно в конце первого цикла, а значит цикл отработает 0 или 1 проход. Удалим сам цикл для наглядности.
Внутренний цикл использует i как ограничение, а она всегда будет равна 0, следовательно цикл выполнится один раз при значении j = 0. Удалим и этот цикл.
Условие получается константам со значением true, а значит оно всегда выполняется. Удалим условие для наглядности.
И того получаем, ты скопировал из неинициализированной m2[0] в m[0] и вывел значение на экран. Согласно принципам C++, это приведёт к undefined behavior (Неопределённое поведение — Википедия)
То что у тебя выводило 16, это как раз оно.
C++:
#include <iostream>
using namespace std;
int main()
{
    int m[]={4,3,9};
    int n=3;
    int m2[n];
    int i=0;
    int j=0;
    m[j]=m2[i];
    cout<<"Three for: "<<m[i];
}
 
Сверху Снизу