关于C语言中一段liitle代码的争论

关于C语言中一段liitle代码的争论,c,compiler-construction,compiler-errors,C,Compiler Construction,Compiler Errors,我的朋友和我正在就这段代码争论: #include <stdio.h> #include <stdio.h> int foo (int k) { int i, n; for (i = i ? 0 : i, n ^= n; i < sizeof(k) * 8;) n += k >> i++ & ~-2; return n; } #包括 #包括 内富(内k) { inti,n; 对于(i=i?0:i,n

我的朋友和我正在就这段代码争论:

#include <stdio.h>
#include <stdio.h>

int foo (int k) 
{
    int i, n;

    for (i = i ? 0 : i, n ^= n; i < sizeof(k) * 8;)
        n += k >> i++ & ~-2;
    return n;
}
#包括
#包括
内富(内k)
{
inti,n;
对于(i=i?0:i,n^=n;i>i++&-2;
返回n;
}

我怀疑它不会被编译,因为
I
未初始化,但我的朋友认为它会。你觉得怎么样

从语法的角度来看,这段代码似乎非常有效。所以它应该是可编译的

但是如果你试着运行它。。。它有太多未定义的行为,以至于我停止计数


i
不是未定义的,它是未初始化的。它在局部变量定义中得到了完美的定义。C不是Java,变量不一定要初始化才能使用

应该没问题,因为您确实将
i
声明为int变量。我通过我的编译器(GCC)编译了您的代码,看起来您的代码可以编译。我在foo函数中替换了一些整数,结果似乎返回的整数很好。例如,foo(5)将产生2

你试过自己编译吗?我在VC上编译过,但在GCC和ideone.com上确实很不错。没有人赢,但我们都输了一点……你和你的朋友一定很受欢迎。“for”循环中“i”和“n”的初始赋值始终为零,即使它们没有初始化。我不明白在面试中问你这些垃圾有什么用,除非他们担心你会理解它,因此有能力产生它,或者他们的代码库中已经有这种垃圾。在这两种情况下,我认为您躲过了一个子弹。当循环体第一次执行时,“I”和“n”将为零,而不管它们的初始值是多少。@EJP:No,
n^=n
的任何特定值都将为0,但如果它未初始化,则为UB,你没有任何保证。@rodrigo n^=n对于n的任何值,period,都是零,无论是“特定”还是其他,不管这意味着什么。@EJP:我希望事情能这么简单,但事实并非如此。UB优先于您可能想到的任何逻辑。很多