这个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
来评估表达式。