2010-09-19 2 views
2

Это был популярный вопрос, как печатать привет мир без использования semicolon.I знаю много кодов, но это звучит странно, потому что я не могу получить логику позади него. Пожалуйста, помогите мне знать как он печатает.Как на самом деле это работает, если инструкция работает

if(printf("hello world")){} 
+4

Почему downvotes? –

+1

В чем же ваш вопрос? Думаю, эта линия там даже не компилируется. –

+4

«Это был популярный вопрос, как печатать привет мир без использования точки с запятой»; в домашней работе? –

ответ

29

Немного о точках с запятой - это немного неверное направление «Я умнее вас».

Однако, когда вы получите это, вы будете знать что-то о c;

Вот серия программ, которые могут вам помочь. Скомпилировать и запустить каждый из них, а затем думать о том, что они делают и как они отличаются от тех, которые были до:

#include <stdio.h> 
int main(int argc, char**argv){ 
    int i = printf("Hello, world!\n"); 
    printf("%d\n",i); 
    return 0; 
} 

#include <stdio.h> 
int main(int argc, char**argv){ 
    if (1) { 
    printf("condition evaluated as true\n"); 
    } else { 
    printf("condition evaluated as false\n"); 
    } 
    return 0; 
} 

#include <stdio.h> 
int main(int argc, char**argv){ 
    if (printf("Hello, world!\n")) { 
    printf("condition evaluated as true\n"); 
    } else { 
    printf("condition evaluated as false\n"); 
    } 
    return 0; 
} 

#include <stdio.h> 
int main(int argc, char**argv){ 
    if (printf("Hello, world!\n")) { 
    } 
    return 0; 
} 

Наконец, вы можете опустить e return from main (который в этом случае неявно возвращает 0).Таким образом, вы получаете:

#include <stdio.h> 
int main(int argc, char**argv){ 
    if (printf("Hello, world!\n")) { 
    } 
} 

который представляет собой полную, стандартную совместимую версию Hello, world! без точек с запятой.

+2

Молодцы, это правильный подход. К сожалению, SO не стимулирует его, и я тоже склонны давать прямые ответы даже новичкам, которым потребуется больше руководства. –

+5

+1 для пошагового объяснения. –

+0

@ dmckee: Вы должны были объяснить, почему он может оставить заявление о возврате ;-) –

7

Вы должны поставить точку с запятой, так или иначе, только после того, если заявления, или вы должны поставить пустой блок после него.

if(printf("hello world")) 
    ; 

или

if(printf("hello world")) {} 

EDIT: Я был уверен, что в этом вопросе не было пустой блок ... Я должен прочитать это неправильно, или это было Ниндзя аннотированный ,

Это работает, потому что printf является нормальной функцией, возвращая количество напечатанных символов (как вы можете ясно видеть из своего documentation); оператор if явно оценивает выражение, тем самым вызывая функцию (которая случайно печатает строку на экране).

6

printf() - это нормальная функция, которая возвращает напечатанные номера, поэтому в основном код сначала вызывает printf(), а затем проверяет, соответствует ли его возвращаемым значения истинным (то есть больше 0 символов, которые выводятся). Это относится к «миру привет», однако это не имеет значения, поскольку условный блок пуст в любом случае.

6

Взгляните на документы:

int printf (const char * format, ...); 

Возвращаемое значение

В случае успеха, общее количество записанных символов возвращается. При отказе возвращается отрицательное число.

Таким образом, он возвращает 11 в случае Hello World, и это число интерпретируется как истинное значение. Значение if необходимо вычислить, чтобы решить, какой блок кода выполнить, что означает, что printf() вызывается в первую очередь.

+0

, как это делает печать?он должен просто проверить, что условие истинно или ложно, которое в этом случае истинно и ничего не должно делать. –

+0

Оператор 'if' не печатает его - вызов' printf() 'делает. Чтобы получить значение истинности условия (т. Е. Возвращаемое значение 'printf()'), нужно вызывать 'printf()'. –

+0

@fahad: Вы близко к этому. Как компилятор проверяет, является ли условие истинным или ложным, когда условие является функцией, а не просто числом? – dmckee

1

Поскольку тип возврата printf является числом, и все числа являются истинными, которые не являются 0 и 0 являются ложными, число в выражении if может быть оценено. Вот почему работает исходный код. Когда вы вызываете функцию в оценке, функция должна возвращать значение до того, как будет выполнена оценка, поэтому printf делает то, что он должен делать, возвращает число, а if оценивает его. Вот что делает этот исходный код.

1

Поскольку операция в этом состоянии, ей не нужна точка с запятой (поэтому она работает без точки с запятой).

Вы по существу передаете условие «если» вывод из printf.

Printf возвращает целое число, общее количество записанных символов, так что если, скажем, Printf выписывает 25 символов, то возвращается 25 и ваш «если» заявление делает что-то вроде этого ...

if(printf("blahblahblah"/* 25 characters */)){} 

if(25){} 

if(TRUE == 25) 
{ 
    // do nothing 
} 

В тот момент, когда оператор «if» оценивает условие, он выполняет все, что находится в этом состоянии. Поэтому, когда инструкция «if» начинает свою оценку, printf запускается, распечатывает текст и возвращает количество символов в проверку состояния «if» (возвращаемое значение из printf). Затем оператор «if» решает, следует ли запускать TRUE или FALSE. Существует только пустая TRUE-часть, поэтому она ничего не делает после выполнения инструкции printf и оценки возврата.

+0

Почему существует необходимость {} вообще? –

+1

@fahad: вам не нужен блок {} после 'if()', но если вы его не используете, следующая инструкция должна заканчиваться точкой с запятой, которую ваш обжаренный бросил вызов вам. – dmckee

+1

Я считаю, что 'TRUE == 25' будет оцениваться как false, но это псевдокод, поэтому я прощу вас ;-). – tia

0

Оператор if просто проверит, оценивало ли выражение ненулевое значение. Так

if (printf("Hello World")) { }

в значительной степени то же самое

if (printf("Hello World") != 0) { }

который printf должен быть вызван, чтобы оценить выражение.

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