@prosg

Как двойной знак равенства влияет на строки в С++?

Привет!Хочу узнать почему не выводиться командой printf строка если нету второго знака '=' в операторе if (if(str[i]='\0')), разве это не обычный знак равенства? дайте ссылку где можно про знаки прочитать

char str[10]="Привет!";
int len=0;

for(int i=0;i<10;i=i+1)
{
if(str[i]=='\0')
break;
len=len+1;
}
printf("Длина строки %s равна %d\n",str,len);
system("pause");
getchar();
return 0;
  • Вопрос задан
  • 3542 просмотра
Пригласить эксперта
Ответы на вопрос 4
@Quilin
Full-stack разработчик
Простой знак равенства в C-подобных языках - это оператор присвоения. Как правило, он возвращает результат присвоения. Двойной знак равенства - это оператор сравнения, и возвращает он bool.

Собственно, в условном операторе необходимо, чтобы выражение в скобках после ключевого слова if возвращало именно bool, так что простое присвоение в данном случае не сработает. Поэтому и нужен двойной знак равенства.

В вашем конкретном коде очевидно, что вам знакома операция присвоения (len = len + 1), но в этом случае достаточно воспользоваться операцией инкремента (len++).
Ответ написан
Комментировать
gbg
@gbg Куратор тега Программирование
Любые ответы на любые вопросы
Тут все плохо:
  1. Длина массива не связана с его содержимым, нужно заменить
    char str[10]="Привет!";
    на
    char str[]="Привет!";
  2. Привязанность к магической константе 10 и лишний счетчик. Измерение длины строки можно сделать вот так:
    size_t len=0;
    for(;str[len];len++);

    после чего в len будет искомая длина строки.
  3. Если необходима защита от строк чрезмерной длины:
    #define MAX_LEN (9000)
    ...
    size_t len=0;
    for(;(str[len])&&(len<MAX_LEN);len++);

Ответ написан
Комментировать
fzfx
@fzfx
18,5 дм
if(str[i]='\0')
присваивание переменной числа 0, а затем проверка и выполнение, если в этой переменной значение, отличное от 0. потому никогда не выполняется, соответственно, break не происходит (проходят все 10 итераций), а до кучи вся строка забивается символом окончания строки, становясь пустой, как следствие, printf ничего и не выводит.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Я понимаю, что Вы только начинаете изучать C++, но некоторые вещи лучше исправлять сразу, чем переучиваться потом.
1. Вы задаёте массив явно, при этом если измените строку на более длинную и забудете поменять длину массива, то в лучшем случае компилятор выдаст ошибку, в худшем строка затрёт другие данные или обрежется по длине массива потеряв при этом завершающий '\0'.
2. В цикле Вы сразу закладываете ограничение на длину строки (i<10), если забудете поменять - на более длинной строке получите длину 10 символов.
3. Сравнивать с нулём необязательно (хотя и ошибки в этом нет). В С++ есть неявное приведение типов, для логических операций 0 и NULL рассматриваются как FALSE, всё остальное как TRUE, так что if (x == 0) эквивалентно if (x). Выбор варианта зависит от самого программиста или стиля, принятого в команде разработчиков.
4. Небольшой трюк - сравнение вида (0 == x) позволит избежать ошибки при невнимательности, когда вместо (x == 0) оказывается (x = 0).
5. Освойте пост- и пре- инкремент/декремент. Операции x++ и x-- увеличивают и уменьшают число на 1 (кроме указателей), результат - значение x до изменения. Операции ++x и --x также увеличивают и уменьшают число на 1, но их результат - значение x после изменения. Для указателей эта операция сдвигает значение на следующий/предыдущий элемент (то есть для int *p операция p++ эквивалентна p = p+sizeof(int)).
char *str = "Привет!";
int len = -1;
while (str[++len]);
printf("Длина строки '%s' равна %d\n", str, len);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы