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

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

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

关于分号的一点点只是“我比你更聪明”误导。

但是,当你得到这个时,你会对c有所了解;

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

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

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

 #include  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  int main(int argc, char**argv){ if ( printf("Hello, world!\n") ) { } return 0; } 

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

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

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

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

 if(printf("hello world")) ; 

要么

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

编辑:我确信在问题中没有空块……我一定读错了,或者它已被忍者编辑过。

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

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

看看文档:

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

回报价值

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

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

由于printf的返回类型是一个数字,并且所有数字都为真且不为0且0为假,因此可以计算if语句中的数字。 这就是源代码工作的原因。 当您在评估中调用函数时,函数必须在评估发生之前返回值,因此printf执行它必须执行的操作,返回一个数字,if会对其进行求值。 这就是这个源代码的作用。

由于操作处于这种状态,因此不需要分号(这就是为什么它没有分号的原因)。

你实际上是作为条件传递给printf的输出“if”。

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语句并评估返回后它什么都不做。

if语句将简单地检查表达式是否已计算为非零值。 所以

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

几乎是一样的

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

需要调用哪个printf来评估表达式。