114. 以下程序运行后屏幕输出为( )。

114. 以下程序运行后屏幕输出为( )。
#include<stdio.h>
void f(int i)
{
int a=2;
a=i++;
printf("%d,",a);
}
main()
{
int a=1,c=3;
f(c);
a=c++;
printf("%d",a);
}
A. 4,3
B. 3,3
C. 4,5
D. 3,5

包小龙虾
浏览 1344回答 3
3回答

onemoo

啊,看了你的描述,我知道你疑惑的点了。你没搞清楚一个关键知识点(我在给你的另一个回答链接中有提到),那就是“表达式本身是有值”的!我用下面的代码片段举例子:void f(int i) {     int a = 2;     a = i++;第 4 行的 a = i++ 这个赋值是把谁的值赋给 a?  答案是:是把“i++ 表达式”的值赋给 a。注意“i++ 表达式”和“变量 i”是两个东西。它们间的关联只不过是:“i++ 表达式”的值是 i 自增前的值。 当然还有一点联系,那就是 i++ 表达式的副作用会使它的操作数(也就是变量 i)自增。这个副作用何时确定发生是由所谓的“序列点规则”控制的。但是 a = i++; 这条语句并不受自增副作用发生时机的影响! 因为 a 被赋予的是“i++ 表达式”的值,不是“变量 i”的值,变量 i 何时自增并没有任何关系,“i++ 表达式”的值已经确定是 i 自增前的值了。 所以 a 的值确定是 3。当然,由序列点规则可知,在执行到分号之后,“变量 i”的值肯定自增了,i 的值变为 4 了。如果你这时 pirintf 打印 i 的话,会打出 4。总之,你可以看到,对于 a = i++ 这样简单的语句来说,副作用和序列点并不会影响 a 所获得的值。

onemoo

#include<stdio.h> void f(int i) {     int a = 2;     a = i++;     printf("%d,", a); } int main(void) {     int a = 1, c = 3;     f(c);     a = c++;     printf("%d", a); }分析下程序执行流程吧:首先,main 函数中 12 行处定义了 a 和 c ,它们的初值分别是 1 和 3。然后 13 行处调用了函数 f,并且传入 c 作为实参。我们看第 3 行 f 的定义。注意:函数参数是“值传递”——函数的形参 i 只是获得实参 c 的值,在函数中改变形参 i 的值并不会影响外面的实参(12 行的 c)。程序执行流程转入函数 f 中:函数 f 中 5 行处定义了 int 型变量 a。注意:函数有自己的作用域,这个 a 和函数 f 外面 main 中 12 行的那个 a 没有任何关系,仅仅是名字相同而已!i++ 表达式的值就是 i 自增前的值。那么形参的值是 3,所以 i++ 表达式的值也是 3,结果第 6 行的 a = i++ 使得 a 的值变为 3。随后 printf 会打印出 3。程序执行流程自函数 f 中返回 main:不管刚才 f 函数中如何改变形参 i,都不会影响实参 c,所以这时 main 中的变量 c 的值还是 3。然后 a = c++ 同理,会把 3 赋值给 a。最后 printf 会再打印出一个 3。上面的解答中我把一些知识点加粗了。下次发代码时最好用发帖时的格式化工具格式化一下(像我这样)另外,如果对于自增表达式还有疑惑,请参考我在其他问题中的回答:http://www.imooc.com/qadetail/83948

onemoo

B两个关键知识点:自增表达式 a++ 的值就是 a 自增之前的值。函数参数是值传递。形参只是获得实参的值,在函数中改变形参的值并不会影响到外面的实参。
打开App,查看更多内容
随时随地看视频慕课网APP