请高人指点下异常

请高人指点下错误
《Linux C编程一站式学习》里的一道错误思考题,现在找不到错误根本原因
#include <stdio.h>
int main(void)
{
int x = -1;
if (x > 0);
printf("is positive\n");
return 0;
}

以上程序能编译过,执行也正常,但执行结果不正确,里面含语议错误,请分析下那里错了。还有,即然错了为什么能编译过呢?

这下面是我改过后的代码:
#include <stdio.h>
int main(void)
{
int x;
x == -1;
if(x > 0)
printf("is positive\n");
return 0;
}

但是不管我x == -1或是x == 1,编译后执行的结果都是一样的,为什么?
错误分析查找

------解决方案--------------------
==是关系运算符,只是用来判断的,不是用来赋值的,和=有区别,要仔细区分。

你的x未赋值,所以x的值是未定义的,一般编译器会给这些未定义的值赋一个固定的值,不同编译器这个值是不一样的。所以你的x值已经被固定了,不管怎么变,运行结果都是一样的。
------解决方案--------------------
int main(void)
{
    int x = -1;
    if (x > 0);
    printf("is positive\n");
        return 0;
}
你在if (x > 0); 加了个分号 if语句就结束了 printf("is positive\n");就不是它的分支语句 不论他的条件是真是假 都会打印is positive

#include <stdio.h>
int main(void)
{
    int x;
    x == -1;
    if(x > 0)
    printf("is positive\n");
    return 0;
}

 x == -1;时 这个是个判断语句 比较x和-1 是相等 x并没初始化 没赋值 他是个垃圾值 一般是负数 x > 0是假 if条件为假就不会执行为真的语句 也就是不会打印is positive 
x = -1; 是赋值语句 这时 x等于-1 -1 > 0  为假 if条件为假就不会执行为真的语句 也就是不会打印is positive
------解决方案--------------------
4楼正解,不过楼主的if(x>0);后面的;我就不明白了,带这个表达式结束符,你还做判断干嘛啊,无论对错,你的输出函数都要打印
------解决方案--------------------
第一个多个分号,第二个没赋值。有符号无符号转换跟楼主的问题有神吗关系,难道数字默认都是无符号的?还一堆人跟风。typid(0).name()打印出来就是个int,还是说不同的编译器有不同的处理?