2013-07-25 2 views
2
#include<stdio.h> 
    int main() { 
    int x; 
    x=~!printf; 
    printf("%x",x); 
} 

Может кто-нибудь объяснить мне процесс вывода результатов этой программы.Как оценить следующую программу c?

+8

Возьмите его за штуку одновременно. В чем смысл 'printf' без круглых скобок после него? Что делает оператор '!'? Что делает оператор '~'? – Sneftel

+2

Строго говоря, ваша программа вызывает неопределенное поведение, так как вы пытаетесь напечатать 'int' с форматом'% x'. –

+1

@CarlNorum Но не является ли формат '% x' для печати' int' в шестнадцатеричном формате? –

ответ

8
  • printf является указателем на функцию printf - таким образом, это в конечном счете целое какой-то.
  • ! унарный NOT, то есть он возвращает 0, если операнд истинен, а 1 - это операнд false. Поскольку printf является истинным (отличным от нуля, поскольку функция определена), подвыражение до сих пор составляет 0.
  • ~ побитовое дополнение. Он переворачивает все биты двоичного числа, которое оно задано. Так как это дано 0, это вернет 0xffffffff.
  • Этот результат затем сохраняется в x и распечатывается в шестнадцатеричном формате.

На 64-битной машине вы можете получить 0xffffffffffffffff, хотя я не совсем уверен.

+0

Если кто-то может прокомментировать, я также не совсем уверен, что унарные НЕ вернутся. Различные веб-сайты говорят, что он возвращает true или false, но AFAIK C не имеет истинного или ложного типа данных. Итак, если он возвращает 1 или 0, какова ширина бита 1 или 0? – Claudiu

+0

Все логические операторы ('!', '! =', '==', '&&' и '||') возвращают 'int'. C99 (и новее) * do * тоже имеют тип boolean. –

+0

@CarlNorum: ах ок. и согласно [wikipedia] (https://en.wikipedia.org/wiki/C_data_types), 'int' определяется как целое число со знаком, размер которого не менее 16 бит. поэтому в зависимости от того, что «int» для компилятора и платформы, вы получите наибольшее значение int для 16-разрядных, 32-битных, 64-битных и т. д. – Claudiu

Смежные вопросы