为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
包小龙虾 2018-07-27 21:45:24
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,3B. 3,3C. 4,5D. 3,5
查看完整描述

3 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

啊,看了你的描述,我知道你疑惑的点了。你没搞清楚一个关键知识点(我在给你的另一个回答链接中有提到),那就是“表达式本身是有值”的!

我用下面的代码片段举例子:

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 所获得的值。

查看完整回答
1 反对 回复 2018-08-09
?
onemoo

TA贡献883条经验 获得超454个赞

#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




查看完整回答
1 反对 回复 2018-07-31
  • 包小龙虾
    包小龙虾
    大神我还是不理解那个a = c++;和 a = i++;,本来我也觉得说++在后就先用值再加,但是你也说了++--这方面还存在副作用和序列点问题,所以我觉得不是;是序列点吗,而a = c++;和 a = i++;后面都有;啊,那不应该是在;前副作用要结束掉,那为什么a不是=4啊
  • 包小龙虾
    包小龙虾
    我一直被++--这个问题困扰着,之前看了不少材料有讲到说++--有副作用和序列点问题,;是一个序列点,但是这题又是在;前++没有完成,我很不理解,大神能不能详细的给我解释下这方面的内容啊?拜托了拜托了,实在是不理解啊
  • onemoo
    onemoo
    我好像知道你哪里不明白了,我试着解释了下
?
onemoo

TA贡献883条经验 获得超454个赞

B


两个关键知识点:

  1. 自增表达式 a++ 的值就是 a 自增之前的值。

  2. 函数参数是值传递。形参只是获得实参的值,在函数中改变形参的值并不会影响到外面的实参。

查看完整回答
1 反对 回复 2018-07-28
  • 包小龙虾
    包小龙虾
    还是不懂,我看不懂这个,可以详细解释下吗?拜托了大神
  • onemoo
    onemoo
    看来是对一些基础知识掌握得不够牢靠,我另写了一个回答,试着详细分析了下程序执行流程
  • 包小龙虾
    包小龙虾
    谢谢大神
  • 3 回答
  • 0 关注
  • 1240 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信