Вывод выражения (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