我已经在 gcc 上测试过这个程序,它的答案是 1。我怎么找不到原因?
main()
{
int c = 5;
printf("%d", main||c);
}
答:它显示在 gcc 编译器(Dev C++)上
main()
{
int c = 5;
printf("%d", main||c);
}
答:它显示在 gcc 编译器(Dev C++)上
当它在没有括号的情况下单独出现时,main
是一个指向函数的指针(实际上是 的地址main()
)。
因此
main || c
相当于
(main != NULL) || (c != 0)
它总是评估为真(即1
)。
这是一个合乎逻辑的OR
操作。如果其中至少一个main
不是NULL
指针或c
非零,则它的计算结果为 1;否则,它产生 0。由于main()
是现有函数,指向它的指针不是NULL
,5
也不为零,所以这段代码将打印1
。
main||c
是一个逻辑OR
函数,它将测试函数指针main
是否为非 NULL 并且c
具有一些非零值。由于它们都不是zero
or NULL
,因此它将始终打印1
,因为这是 logical 的输出OR
。
您应该使用-Wall
gcc 选项对其进行编译(以获取几乎所有警告,-Wextra
您将获得更多警告)。随着gcc-4.8
我越来越
% gcc-4.8 -Wall atiq.c -o atiq
atiq.c:1:1: warning: return type defaults to 'int' [-Wreturn-type]
main()
^
atiq.c: In function 'main':
atiq.c:4:1: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
printf("%d", main||c);
^
atiq.c:4:1: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
atiq.c:4:14: warning: the address of 'main' will always evaluate as 'true' [-Waddress]
printf("%d", main||c);
^
atiq.c:5:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
我认为警告很清楚。你看到它main
总是有一个非空地址,所以main||c
总是正确的。
而且您的代码缺少#include <stdio.h>