【发布时间】:2017-07-18 11:43:43
【问题描述】:
我很清楚,在 C/C++ 函数之外修改按值传递的函数参数是无效的,但编译器允许这样做 - 但会发生什么?是否由参数制作了本地副本并且在函数内可修改?
#include <stdio.h>
void doSomething( int x )
{
x = 42;
printf( "The answer to Life, the Universe and Everything is (always): %i!\n", x );
}
int main( int argc, char **argv )
{
int a = 0;
doSomething( a );
return -a;
}
现在这总是无错误地退出,但是在事物方案(内存空间)中,函数中表示为 x 的值保留在哪里?
我想应该(结合声明和定义)开始:
void doSomething( const int x )
我会让我的手腕被任何半体面的编译器拍打。
【问题讨论】:
-
函数参数是传统上存储在call stack中的变量。
-
注意:不存在称为
C/C++的语言。在这两种语言中,此表达式都会调用未定义的行为。 :) -
Aaarrrghh,没有人(在他们的头脑中)期望未定义的行为,但真的是这样吗?
-
@SouravGhosh 我不认为写入参数是未定义的行为。
-
@BlueWanderer:
C/C++确实调用了未定义的行为。读取C并对其进行修改是未排序的,并且如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用相同标量对象的值的值计算是未排序的,则行为未定义。 ...(C 标准,6.5p2)。自己搜索 C++。
标签: c++ c parameters arguments parameter-passing