我们如何解释以下程序及其成功?(很明显,一定不能有任何错误信息)。我的意思是编译器如何解释main中的第2行和第3行?
#include <stdio.h>
int main()
{
int a,b;
a; //(2)
b; //(3)
return 0;
}
答案 0 :(得分:3)
您
a;
只是一个表达式声明。与C一样,表达式语句中的完整表达式将被计算,并立即丢弃其结果。
例如,这个
a = 2 + 3;
是包含完整表达式a = 2 + 3
的表达式语句。该表达式的计算结果为5
,并且还具有将5
写入a
的副作用。评估并丢弃结果。
表达式声明
a;
以相同的方式处理,除了没有副作用。 由于您忘记初始化变量,对上述表达式的评估可能会正式导致未定义的行为。
显然,实际编译器会完全跳过这些表达式语句,因为它们没有可观察到的行为。
答案 1 :(得分:0)
这就像你尝试这样的事情:
#include <stdio.h>
int main(void){
1;
2;
return 0;
}
正如我们所看到的,我们在这里有两个表达式,后面跟着分号(1;和2;)。根据语言规则,这是一个结构良好的陈述。
它没有任何问题,它只是没用。
但是如果你尝试使用虽然语句(a或b),行为将是未定义的。 当然,编译器会将其解释为无效的语句
L.E:
如果你运行:
#include <stdio.h>
int main(void){
int a;
int b;
printf("A = %d\n",a);
printf("B = %d\n",b);
if (a < b){
printf("TRUE");
}else{
printf("FALSE");
}
return 0;
}
你会得到:
A = 0 B = 0 FALSE
因为 a 且 b 设置为 0 ;
答案 2 :(得分:0)
C中的句子不是控制结构(if,switch,for,while,do while)或控制语句(break,continue,goto,return)是表达式。
每个表达式都有一个结果值 评估表达式的副作用(更改对象的值,写入文件,读取易失性对象以及执行某些操作的函数)。
这种表达的最终结果总是被丢弃 例如,函数printf()返回一个int值,通常不使用该值。然而,产生该值,然后丢弃 但是函数printf()产生副作用,因此必须进行处理。
如果一个句子没有副作用,那么编译器可以自由地丢弃它。
我认为对于编译器来说,检查句子是否没有任何副作用也不会那么难。因此,在这种情况下您可以期待的是编译器将选择不执行任何操作。
此外,这不会影响程序的可观察行为,因此在程序执行结果中获得的内容没有区别。但是,当然,如果编译器完全忽略任何计算,程序将运行得更快。
另外,请注意,在某些情况下,浮点环境可以设置标记,这些标记被视为副作用。
Standard C (C11)说,作为第5.1.2.3.4段的一部分:
实际实现不需要评估表达式的一部分 可以推断出它的价值没有被使用,也没有必要的副作用 生产[...]
结论:必须阅读自己使用的特定编译器的文档。
答案 3 :(得分:0)
这就是为什么你应该使用一些编译警告标志! -Wall会触发一个没有效果的&#34;语句&#34;警告。
如果要查看编译产生的内容,请使用-S进行编译。 尝试使用您的代码,使用/不使用-O(优化)标志......