#include<stdio.h>
int main() {
int x;
x=~!printf;
printf("%x",x);
}
Может кто-нибудь объяснить мне процесс вывода результатов этой программы.Как оценить следующую программу c?
#include<stdio.h>
int main() {
int x;
x=~!printf;
printf("%x",x);
}
Может кто-нибудь объяснить мне процесс вывода результатов этой программы.Как оценить следующую программу c?
printf
является указателем на функцию printf
- таким образом, это в конечном счете целое какой-то.!
унарный NOT, то есть он возвращает 0
, если операнд истинен, а 1
- это операнд false. Поскольку printf
является истинным (отличным от нуля, поскольку функция определена), подвыражение до сих пор составляет 0
.~
побитовое дополнение. Он переворачивает все биты двоичного числа, которое оно задано. Так как это дано 0
, это вернет 0xffffffff
.x
и распечатывается в шестнадцатеричном формате.На 64-битной машине вы можете получить 0xffffffffffffffff
, хотя я не совсем уверен.
Если кто-то может прокомментировать, я также не совсем уверен, что унарные НЕ вернутся. Различные веб-сайты говорят, что он возвращает true или false, но AFAIK C не имеет истинного или ложного типа данных. Итак, если он возвращает 1 или 0, какова ширина бита 1 или 0? – Claudiu
Все логические операторы ('!', '! =', '==', '&&' и '||') возвращают 'int'. C99 (и новее) * do * тоже имеют тип boolean. –
@CarlNorum: ах ок. и согласно [wikipedia] (https://en.wikipedia.org/wiki/C_data_types), 'int' определяется как целое число со знаком, размер которого не менее 16 бит. поэтому в зависимости от того, что «int» для компилятора и платформы, вы получите наибольшее значение int для 16-разрядных, 32-битных, 64-битных и т. д. – Claudiu
Возьмите его за штуку одновременно. В чем смысл 'printf' без круглых скобок после него? Что делает оператор '!'? Что делает оператор '~'? – Sneftel
Строго говоря, ваша программа вызывает неопределенное поведение, так как вы пытаетесь напечатать 'int' с форматом'% x'. –
@CarlNorum Но не является ли формат '% x' для печати' int' в шестнадцатеричном формате? –