C 程序的输出 |设置 9
预测以下程序的输出。
问题 1
int main()
{
int c=5;
printf("%d\n%d\n%d", c, c <<= 2, c >>= 2);
getchar();
}
输出:依赖于编译器
参数的计算顺序不是由 C 标准定义的,而是取决于编译器的实现。依赖参数评估的顺序永远是不安全的。例如,像上面这样的函数调用在一个编译器与另一个编译器之间的行为可能非常不同。
参考:
http://gcc.gnu.org/onlinedocs/gcc/Non_002dbugs.html
问题2
int main()
{
char arr[] = {1, 2, 3};
char *p = arr;
if(&p == &arr)
printf("Same");
else
printf("Not same");
getchar();
}
输出:不一样
&arr 是 &arr[0] 的别名,返回数组第一个元素的地址,而 &p 返回指针 p 的地址。
现在试试下面的程序
int main()
{
char arr[] = {1, 2, 3};
char *p = arr;
if(p == &arr)
printf("Same");
else
printf("Not same");
getchar();
}
问题 3
int main()
{
char arr[] = {1, 2, 3};
char *p = arr;
printf(" %d ", sizeof(p));
printf(" %d ", sizeof(arr));
getchar();
}
输出 4 3
sizeof(arr) 返回数组中所有元素使用的内存量
sizeof(p) 返回指针变量本身使用的内存量。
问题 4
int x = 0;
int f()
{
return x;
}
int g()
{
int x = 1;
return f();
}
int main()
{
printf("%d", g());
printf("\n");
getchar();
}
输出:0
在 C 中,变量总是静态(或词法)范围的。 f() 中的 x 绑定到全局变量 x 是在编译时定义的,不依赖于调用它的人。因此,上述程序的输出将为 0。
附带说明一下,Perl 支持动态和静态范围。 Perl 的关键字“my”定义了静态作用域的局部变量,而关键字“local”定义了动态作用域的局部变量。所以在 Perl 中,类似的(见下文)程序将打印 1。
$x = 0;
sub f
{
return $x;
}
sub g
{
local $x = 1; return f();
}
print g()."\n";
参考:
http://en.wikipedia.org/wiki/Scope_%28programming%29