这个if语句实际上是如何工作的

fud*_*din 3 c

如何在不使用分号的情况下打印hello world一直是一个流行的问题.我知道许多代码,但这个听起来很奇怪,因为我无法得到它背后的逻辑.请帮我知道它是如何打印的.

if(printf("hello world")){}
Run Code Online (Sandbox Code Playgroud)

dmc*_*kee 30

关于分号的一点点只是"我比你更聪明"误导.

但是,当你得到这个,你会知道关于c的事情;

这是一系列可能有用的程序.编译并运行每一个,然后考虑它们的作用以及它们与之前的不同之处:

#include <stdio.h>
int main(void) {
  int i = printf("Hello, world!\n");
  printf("%d\n",i);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
int main(void) {
  if ( 1 ) {
    printf("condition evaluated as true\n");
  } else {
    printf("condition evaluated as false\n");
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)
#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;
}
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
int main(void) {
  if ( printf("Hello, world!\n") ) {
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以省略main的返回(在这种情况下隐式返回0).所以你得到:

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

这是Hello,world的完整,标准兼容版本!没有任何分号.


Mat*_*lia 7

无论如何,你必须在if语句之后添加分号,或者你必须在它之后放一个空块.

if(printf("hello world"))
    ;
Run Code Online (Sandbox Code Playgroud)

要么

if(printf("hello world")) {}
Run Code Online (Sandbox Code Playgroud)

编辑:我确信在问题中没有空块...我必须读错了,或者它已被忍者编辑过.

它的工作原理是因为printf是一个正常的函数,返回打印的字符数(正如你可以从文档中清楚看到的那样); if语句显然会计算表达式,从而调用函数(顺便在屏幕上打印字符串).


Chr*_*isM 6

printf()是一个返回打印数字的普通函数,所以基本上代码首先调用printf()然后检查它的返回值是否为真值(即输出的字符数超过0).这是"hello world"的情况,但无关紧要,因为条件块无论如何都是空的.


Tum*_*mas 6

看看文档:

int printf ( const char * format, ... );
Run Code Online (Sandbox Code Playgroud)

回报价值

成功时,返回写入的字符总数.失败时,返回负数.

所以它在Hello World案例中返回12 11,并且该数字被解释为真值.需要计算if的值以决定执行哪个代码块,这意味着首先调用printf().