在C源代码中返回无处(?)

时间:2010-07-05 20:52:28

标签: c

看看下面的代码。

"Hello " "World!";
"The number is ", 37;
int x=23;
char *y="232";
x,x+2,x*3;
atoi(y) - x;

它是C(99)源的完美有效片段。 但!所有表达都无处可去! 如何跟踪甚至使用所有这些匿名值? 它们存储在哪里以及它们的用途是什么?

7 个答案:

答案 0 :(得分:8)

这些价​​值无处可去。你无法检索它们。事实上,大多数都是由编译器优化的。

整个片段可以简化为atoi(“232”),因为函数调用通常无法优化。

答案 1 :(得分:4)

那些特殊的表达方式毫无用处。另一方面,这是允许的,因为一些表达式有副作用(可能还有返回值),有时只需要副作用。

答案 2 :(得分:2)

没有副作用的表达不是特别有用。 通常你会在那些地方和函数体中找到一个函数调用 实际上会导致程序中的一些状态变化。

语言有很多愚蠢的方法无所事事。考虑C语句:

  ;

它没有做任何事情。

答案 3 :(得分:2)

你问这是不是:

int main() {
   1;
}

是有效的C代码吗?如果是的话,是的,而且一直都是。

答案 4 :(得分:2)

每次调用printf(3)而不检查其返回值(已弃用)时,也会发生同样的情况。虽然函数调用可能有副作用(printf(3)肯定会有),因此仍然会生成执行它的指令。在给定适当的优化标志的情况下,大多数现代编译器都会删除您列出的大多数语句。

如果您真的想看看会发生什么,请使用(例如-S)编译您的源代码到汇编(-O2 GCC选项)并且不进行优化并跟踪说明。

答案 5 :(得分:1)

逗号运算符按顺序计算表达式并返回最后一个的值。它仅在前面的表达式执行诸如赋值的副作用时才有用。

据我所知,这里使用逗号是多余的,表达式的值被丢弃 - 你无法检索它们。除非你在特殊的C语译员的背景下写这些行......?

答案 6 :(得分:1)

从功能的角度来看,所有这些表达式的结果都会丢失。如果良好的优化正在起作用,那么它们根本就不会被计算出来。但让我们假设他们是。在这种情况下,“where”结果可用取决于编译器如何翻译代码,这一事实可被认为是不可预测的。

在x86机器上,您可以认为整数结果和指针结果存储在eax中(然后将被删除),但它只是一个假设;如果对于特定的编译器和代码是正确的,则可能不适用于其他编译器或者如果您更改了代码。也可能会发生这些值被压入堆栈,然后它再次递增,因此,直到它不被重用,您可以在堆栈上找到该值。可以使用与eax相同的参数。

通过逗号绑定的部分有些不同。像a, b这样的东西被读作“执行a,丢弃任何结果然后执行b”,这样a的结果就会“按照定义”丢失(当然,查看asm代码,你也可以在这里case发现它仍然在某处可用,但可能确实不是在b被评估之后)