Как это, если оператор работает, чтобы избежать использования точки с запятой? - PullRequest
3 голосов
/ 20 сентября 2010

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

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

Ответы [ 7 ]

30 голосов
/ 20 сентября 2010

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

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

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

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

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

#include <stdio.h>
int main(void) {
  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(void) {
  if ( printf("Hello, world!\n") ) {
  }
  return 0;
}

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

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

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

7 голосов
/ 20 сентября 2010

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

if(printf("hello world"))
    ;

или

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

РЕДАКТИРОВАТЬ: Я был уверен, что в вопросе не было пустого блока ... Я, должно быть, прочитал его неправильно, или он был отредактирован ниндзя.

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

6 голосов
/ 20 сентября 2010

Посмотрите документы:

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

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

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

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

6 голосов
/ 20 сентября 2010

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

1 голос
/ 20 сентября 2010

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

Вы по сути передаете в качестве условия «if» вывод из printf.

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

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

if( 25 ){}

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

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

1 голос
/ 20 сентября 2010

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

0 голосов
/ 20 сентября 2010

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

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

почти так же, как

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...