解释说明无效

时间:2015-07-28 17:53:42

标签: c compiler-warnings instructions

我们如何解释以下程序及其成功?(很明显,一定不能有任何错误信息)。我的意思是编译器如何解释main中的第2行和第3行?

#include <stdio.h>

int main()
{
int a,b;
a; //(2)
b; //(3)
return 0;
}

4 个答案:

答案 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(优化)标志......