void main() {
int i, j=6;
for(; i=j ; j-=2 )
printf("%d",j);
}
按照常规格式,第一个分号后面应该是一个“条件”,但这里却是“初始化”,因此应该出现错误提示。这个格式怎么可能是有效的呢?
但实际输出结果却是“642”。
void main()
的。 它不处理命令行参数,对吗? - Sourav Ghoshi=j
也是一个表达式,其值是赋值后i
的值。因此它可以作为条件。
通常会这样巧妙地使用:
if ((ptr = some_complex_function()) != NULL)
{
/* Use ptr */
}
有些程序员喜欢将赋值和检查合并到一行代码中。这种写法的可读性好坏取决于个人观点。
642
。i=j
被解释为 (i = j) != 0
。gcc -Wall -W -Werror
clang
,请使用 clang -Weverything -Werror
。保留html,不做解释。这是一个非常好的问题。
为了真正理解它,你最好知道C代码在计算机中是如何执行的: 首先,编译器将C代码编译成汇编代码,然后汇编代码将被翻译成可以直接在主存储器中运行的机器码。
至于你的代码:
void main() {
int i, j=6;
for(; i=j ; j-=2 )
printf("%d",j);
}
Especially look at this:
010217D0 mov eax,dword ptr [j]
010217D3 mov dword ptr [i],eax
010217D6 cmp dword ptr [i],0
010217DA je main+4Fh (010217EFh)
void main
是非标准的写法。 - n. m.(i=j) != 0
的简写,因为0
是false
。 - 4castle-Wall
选项编译clang,你会得到两个警告。第一个是因为你弄错了main
的声明。第二个是因为你弄错了for
语句(将赋值用作条件表达式)。如果你没有使用-Wall
选项进行编译和/或忽略了警告,那么我无法充分表达我的意见(由于“友好”政策)。 - user3386109i=j
是一个非void表达式,这意味着它完全可以作为“条件”。 - AnT stands with Russia