C programming для начинающих: часть 10 – операторы равенства и присваивания

 

Предыдущая часть

Давайте рассмотрим операторы в C более детально.

Операторы – это специальные символы, которые выполняют определённые операции, такие как сложение или умножение чисел.

Наиболее часто используемые и важные операторы – операторы присваивания и сравнения.

Присваивание

Рассмотрим такой пример:

#include <stdio.h>

int main(int argc, char **argv) {
        char agestring[10];
        int age;
        int bonus;

        printf("Enter your age : ");
        gets(agestring);
        age = atoi(agestring);
        if (age > 45) {
                bonus = 1000;
        } else {
                bonus = 500;
        }
        printf("Your age is %d, so your bonus is %d.\n", age, bonus);

        return(0);
}

Оператор присваивания задаёт переменную слева равной значению справа:

...
bonus = 1000
...

При этом помните, что тип данных, который присваивается, должен быть того же типа, что и переменная.

Например такой код будет работать корректно:

...
    char a;
    int b;

    a = 'a';
    b = 1;

    printf("A: %c, B: %d\n", a, b);
...

./test
A: a, B: 1

Если же вы попробуете присвоить неподходящий тип – сам компилятор выдаст вам предупреждение, а результат работы программы будет совсем не тем, что вы ожидаете:

...
    char a;
    int b;

    a = 'a';
    b = "thisIsBe";

    printf("A: %c, B: %d\n", a, b);
...

Собираем:

gcc test.c -o test
test.c: In function ‘main’:
test.c:10:7: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
b = "thisIsBe";
^

И результат:
./test
A: a, B: 4195764

Сравнение

Будьте внимательны, используя символы равенства: один сивол “=” выполняет присваивание, тогда как два “==” – являются оператором сравнения, используемые для проверки данных.

Давайте рассмотрим такой пример:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, int **argv) {

    int num1, num2;

    num1 = atoi(argv[1]);;
    num2 = atoi(argv[2]);;

    if (num1 == num2) {
        printf("Args equal: %d, %d\n", num1, num2);
    } else {
        printf("Args differs: %d, %d\n", num1, num2);
    }

    return 0;

}

Его выполнение:

./test 1 1
Args equal: 1, 1
./test 1 2
Args differs: 1, 2

Мы присваиваем первый аргумент переменной num1, а второй аргумент – num2, после чего выполняем их сравнение:

...
if (num1 == num2)
...

Если вы ошибётесь тут, и используете одинарный символ равенства вместо двойного – результат будет совершенно другим:

...
    num1 = atoi(argv[1]);;
    num2 = atoi(argv[2]);;

    if (num1 = num2) {
        printf("Args equal: %d, %d\n", num1, num2);
    } else {
        printf("Args differs: %d, %d\n", num1, num2);
    }
...

Теперь вместо выполнения сравнения – будет выполнено присваивание:

./test 1 2
Args equal: 2, 2

Таку ошибку совершить очень легко, поэтому будьте внимательны при выполнении таких операций.

Продолжение – часть 11 – if/else и проверка равенства.