GCC将编译,但clang不会

GCC将编译,但clang不会,c,gcc,clang,C,Gcc,Clang,所以在我的期末考试中,有一个练习问程序将打印什么 代码如下: #包括 int main(){ int x=5,y=4; 如果(x>y); printf(“A”); 如果(x=4) printf(“%d”,x+y); 返回0; } 当我试图在Debian机器上使用gcc-ansi-pedantic-Werror编译它时,它编译得很好并输出“A8” 但是,当我尝试使用clang-ansi-pedantic-Werror编译它时,我收到了有关if(x=4)表达式缺失=和if(x>y)上缺失语句的错误

所以在我的期末考试中,有一个练习问程序将打印什么

代码如下:

#包括
int main(){
int x=5,y=4;
如果(x>y);
printf(“A”);
如果(x=4)
printf(“%d”,x+y);
返回0;
}
当我试图在Debian机器上使用
gcc-ansi-pedantic-Werror
编译它时,它编译得很好并输出“A8”

但是,当我尝试使用
clang-ansi-pedantic-Werror
编译它时,我收到了有关
if(x=4)
表达式缺失
=
if(x>y)上缺失语句的错误


为什么会发生这种情况?哪个答案可以标记为正确?

编译器可能会发出不同的警告。例如,
clang
警告空语句,而
gcc
不警告空语句

因此,如果设置-Werror,它将使用gcc编译,但不会使用clang编译

顺便说一句,是什么阻止您读取编译器消息。它们是不言自明的。它甚至展示了如何纠正它

#1 with x86-64 clang 9.0.0
:6:9:错误:if语句的正文为空[-Werror,-Wempty body]
如果(x>y);
^
:6:9:注意:将分号放在单独的一行以使此警告静音
:8:5:错误:将赋值结果用作不带括号的条件[-Werror,-wParenthes]
如果(x=4)
~^~
:8:5:注意:在作业周围加括号以使此警告静音
如果(x=4)
^
(  )
:8:5:注意:使用“==”将此赋值转换为相等比较
如果(x=4)
^
==
:12:2:错误:文件末尾没有换行符[-Werror,-Wnewline eof]
}
^
产生了3个错误。
返回的编译器:1

编译器可能会发出不同的警告。例如,
clang
警告空语句,而
gcc
不警告空语句

因此,如果设置-Werror,它将使用gcc编译,但不会使用clang编译

顺便说一句,是什么阻止您读取编译器消息。它们是不言自明的。它甚至展示了如何纠正它

#1 with x86-64 clang 9.0.0
:6:9:错误:if语句的正文为空[-Werror,-Wempty body]
如果(x>y);
^
:6:9:注意:将分号放在单独的一行以使此警告静音
:8:5:错误:将赋值结果用作不带括号的条件[-Werror,-wParenthes]
如果(x=4)
~^~
:8:5:注意:在作业周围加括号以使此警告静音
如果(x=4)
^
(  )
:8:5:注意:使用“==”将此赋值转换为相等比较
如果(x=4)
^
==
:12:2:错误:文件末尾没有换行符[-Werror,-Wnewline eof]
}
^
产生了3个错误。
返回的编译器:1

=
=
不是同一个操作符。是的,我明白了。我不明白的是为什么它在GCC中编译,而不是在clang中编译。所以显然
GCC
相信你知道你在做什么,而
clang
不是:)
if(x>y);printf(“A”)
等于
if(x>y){/*空块*/}printf(“A”)
有什么区别吗?
=
==
不是同一个操作符。是的,我知道。我不明白的是为什么它用gcc编译,而不是用clang。所以显然
gcc
相信你知道你在做什么,而
clang
不是:)
如果(x>y);printf(“A”);
等于
如果(x>y){/*空块*/}printf(“A”);
gcc-Wall-Wextra-Wpedantic
有什么区别吗?