Вывод выражения (3 ^ 6) + (a ^ a) на языке C?

Я программист-любитель С, и я столкнулся с этим вопросом в книге, может ли кто-нибудь дать мне свое действительное объяснение. Я смущаюсь о том, что этот знак знака делает в программе C.

#include <stdio.h>

int main(void)
{
    int a;
    printf("%d", (3^6) + (a^a));
    return 0;
}

Ответы

Ответ 1

int a;
printf("%d",(3^6)+(a^a));

Оценка выражения (3^6)+(a^a) вызывает undefined поведение как a не инициализируется и имеет неопределенное значение.

(C11, 6.3.2.1p2) "Если lvalue обозначает объект с автоматическим временем хранения, который мог быть объявлен с классом хранения регистров (никогда не был принят его адрес), и этот объект не инициализирован (не объявлен с помощью инициализатор и никакое присвоение ему не выполнялось до использования), поведение undefined."

Ответ 2

Я сбиваюсь с толку относительно того, что этот знак знака делает в программе на C.

^ является логическим оператором XOR (не путайте с оператором питания, к сожалению, недоступным в C).

Вывод выражения (3 ^ 6) + (a ^ a) на языке C?

Результат программы - это значение мусора, так как поведение вашей программы undefined. Зачем? Потому что a не инициализируется.

n1570: Приложение J: J.2 Undefined поведение

Поведение Undefined в следующих случаях:
...
- lvalue, обозначающий объект с автоматическим временем хранения, который мог бы быть объявленный с классом хранения регистров, используется в контексте, который требует значения обозначенного объекта , но объект не инициализирован (6.3.2.1). 1


<суб > 1. Акцент мой.

Ответ 3

Результат программы приведет к undefined поведению, поскольку a не инициализируется и, следовательно, результат приведет к любому значению мусора.

Ответ 4

^ обозначает XOR.

XORing с таким же возвратом бит 0, другой возврат бит 1.

Eg. 1 ^ 0 == 1, 1 ^ 1 == 0

Любая переменная int в C - 16 бит (16-битный компилятор) или 32-разрядный (32-битный компилятор). Таким образом, в любом случае, будет ли он определен или нет, a будет 16/32 битным шаблоном.

Рассмотрение 16-битного компилятора

Бит-шаблон 3 - 0000 0000 0000 0000 0011

XOR

Битовая диаграмма 6 - 0000 0000 0000 0000 0110

Результат → 0000 0000 0000 0000 0101 --- > 5

Не имеет значения, определено ли a или нет.

a ^ a всегда будет равно 0. Так как в обоих случаях мы имеем бит-шаблон.

Поэтому (3 ^ 6) + (a ^ a) = 5.


Также, если вопрос есть (3 ^ 6) + (a ^ ~ a)

Тогда как описано выше 3 ^ 6 → 5

Рассмотрение 16-битного компилятора для значения типа мусора и целого типа допустим, что а = 1. то a будет 0000 0000 0000 0001

и ~ a будет 1111 1111 1111 1110

поэтому a ^ ~ a будет → 1111 1111 1111 1111 → 65535 (Unsigned int)

Следовательно, (3 ^ 6) + (a ^ ~ a) = 5 + 65535 = 65540, которое находится за пределами допустимого диапазона.

В результате он будет превышать 5, начиная с 0, что приведет к → 4

Ответ = 4