>第 3 章 简单函数>形参和实参>习题

尹志伟 zhiweiyin1985@gmail.com
2009-08-10 09:05:55

1、建议:在形参和实参的章节中,可以说一下引用的概念(或者提一下,在指针后详述),因为初学者很容易犯错的地方有两个,一个是以为函数调用时作为参数的变量可以被“被调用函数”修改,另一个是返回被调用函数中临时变量的地址
2、不知道您的这本书能不能进一步整理一下,把重点内容按照重要性利用不同方式标识一下(例如:加粗、划线),以适合各个阶段的学习者。因为我看这个的感觉是:很多东西都很明确,但是为了不漏掉什么内容,还是得一点儿一点儿细看,感觉比较耗时间。


但庆丰 wellsoung@gmail.com
2009-08-11 22:00:41

刚才的关于“man 3 printf”的问题已经解决了,不好意思打搅了老师,是我一时粗心没有完善手册导致的!
谢谢!


宋劲杉 songjinshan@akaedu.org
2009-08-12 22:52:40

1. C语言里没有引用的概念。
2. 没这个必要。


武智勇 loamier@gmail.com
2010-01-05 14:48:00

int increment(int x)
{
	x = x + 1;
        return x;
}

int main(void)
{
	int i = 1, j = 2;
	increment(i); /* i now becomes 2 */
	increment(j); /* j now becomes 3 */
	return 0;
}


宋金殿 songjindian.kobe@yahoo.com.cn
2010-03-18 11:44:39

宋老师,首先感谢你的共享,找了好长时间终于找到了最适合我看的一本书,本节的第一道题i和j的值在main中是不会变的,能不能把他们当做常量来看待,常量是不会改变的,希望老师能回答!


宋劲杉 songjinshan@gmail.com
2010-03-18 20:06:46

回头找常量的定义是什么。常量就是常量,不要乱用定义


徐君 xxjj2003@gmail.com http://www.hznovel.com/nowwelldba
2010-04-02 08:55:42

请问一下 例1 我编译怎么没有输出啊,我加了个printf(“%d\n”,i);
printf(“%d\n”,j);
i值为1,j值为2.


石匠 code_smith@sohu.com
2010-04-06 16:05:58

徐君 xxjj2003@gmail.com:

It should be printed as normal. Could you show us your whole code?


lifuli lifuliufoet@163.com
2010-05-29 11:04:23

大家好:
    关于第二个问题,我使用的是VISUAL STUDIO,就会出现error C3861: “printf”: 找不到标识符


宋劲杉 songjinshan@gmail.com
2010-06-02 09:46:40

抱歉。不负责解答Windows下的编程问题。


虫子 xusulong@gmail.com
2010-06-12 22:55:53

第二个问题是因为没有包含头文件的话,将调用系统的printf(即文中说的位于第1个Section的系统命令printf),这个和c的库函数c是不同的,因此出现这个警告


宋劲杉 songjinshan@gmail.com
2010-06-13 17:34:48

楼上的理解是不对的。再想想。


王雪 giveareport@126.com
2010-07-03 00:20:49

第一个call by value只是给形参赋值,所以原变量的值是不变的
第二个compile过程中,编译器会将会寻找printf的函数声明和定义,在整个代码中包括包含的头文件中都无法找到,自然会提示printf函数未定义


陈yaocheng yiyu89103@126.com
2010-07-07 17:32:51

第一题是关于形参与实参之间的值传递问题,形参不能够返回值给实参。
第二题是编译出错,没有声明printf函数,所以warning


陈yaocheng yiyu89103@126.com
2010-07-07 17:39:35

#include"stdio.h"

int increment(int *x)
{
   *x = *x + 1;
   return *x;
}

int main()
{
   int a, b;
   int *i, *j;
    a = 1;
    b = 2;
    i = &a;
    j = &b;
   increment(i); /*i now becomes 2*/
   increment(j); /*j now becomes 3*/
   printf("i = %d, j = %d\n", *i, *j);
   return 0;
}

结果:
i = 2, j = 3


赵广兴 guangxingzhao@gmail.com http://www.xingxingjia.com/
2010-07-14 06:22:59

@陈yaocheng yiyu89103@126.com 
2010-07-07 17:39:35

#include "stdio.h"

#include <stdio.h>

使用双引号和尖括号是一样的吗?有什么区别吗?



宋劲杉 songjinshan@gmail.com
2010-07-15 12:44:50

本书前半部分都没有用双引号include吧。后面会讲到的。


Louis alzl333@sina.com
2010-08-21 21:07:09

#include <stdio.h>

void increment(int *x)
{
   *x = *x + 1;
}

int main()
{
   int i = 1 , j = 2;
   increment(&i); /*i now becomes 2*/
   increment(&j); /*j now becomes 3*/
   printf("i = %d, j = %d\n", i, j);
   return 0;
}


郝凯 haokaii@gmail.com
2010-09-25 11:21:24

第二个问题 由于没有包含头文件,所以在执行printf时编译器没有看到声明,因此激发了隐声明的机制,printf函数被声明为
int printf(char *format)
与真正定义的
int printf(const char *format,……)
不一样,所以才会有incompatible的warning


常锋 6329775@qq.com
2010-10-15 11:10:06

习题:
int increment(int x)
{
	x = x + 1;
	return x;
}

int main(void)
{
	int i = 1, j = 2;
	increment(i); /* i now becomes 2 */
	increment(j); /* j now becomes 3 */
	printf("%d:%d\n", increment(i), increment(j));
	return 0;
}
结果:i = 2, j = 3


破小白 brpoper@gmail.com
2010-11-03 21:32:59

例一 应该是没有return 
例2 不太理解,应该是没有相应的表头,不能包含进相应的函数吧……
请老师解答


肖德军 xhu_jun@126.com
2010-11-24 09:42:47

老师你好 
    这题目好像不能达到效果,就是行参不能传递参数给实参。
    如果要达到效果的话,有必须用行参,我想了很久,都没有想到办法,望老师赐教。


rufeng newingc@gmail.com http://www.xin-e.cc/
2011-01-08 21:21:19

顶 郝凯 haokaii@gmail.com 


rikhtdss rikhtdss@126.com
2011-03-08 11:03:45

  1 #include <stdio.h>
  2 
  3 int increment(int x)
  4 {
  5         x = x + 1;
  6         return x;
  7 }
  8 
  9 int main(void)
 10 {
 11         int i =1, j = 2;
 12         printf("i+1=%d\n",increment(i));
 13         printf("j+1=%d\n",increment(j));
 14         return 0;
 15 }


swolice shuitingjun@126.com
2011-03-15 16:10:23

2.
#include <stdio.h>
#include <stdlib.h>
..
..
..


lingshiying lingshiying@126.com
2011-03-16 09:34:33

1、第一道题,因为C用的是值传递,所以i、j只是把值传给函数,但是与函数内的参数x是两个不同的变量。所以不管x的值怎么变,都不会改变i、j的值。
2、没有调用头文件,说明没有给printf做声明。编译器就会认为printf是隐式声明。
int printf(void),隐式声明应该是这样的。但是实际上我们调用printf的时候给了参数-字符串常量,并且printf会返回这个int的值。所以编译器会报错。


rtxbc rtxbc@163.com http://rtxbc.javaeye.com/
2011-04-01 17:10:39

我们在main函数中调用increment增加变量i和j的值,这样能奏效吗?为什么?
肯定不增加,函数内部的局部变量在函数执行完就结束了——生命周期问题。


如果在一个程序中调用了printf函数却不包含头文件。。。。
函数库丢了,没有printf的定义,当然会报错。


Ivon yifeng.ivon.wang@hotmail.com
2011-10-25 22:56:03

实参 形参之间的值传递,如果能知道这2个参数在内存的存贮方式,就明白了。形参是在内存里另外的一个地方,开了一个和实参一样大小的空间,并存储着与实参同样值。所以改变形参的值,不会改变实参的值。要达到这个目的,可以使用指针。
C语言的灵魂就是指针。


caozhijie czj627@126.com
2011-12-22 23:17:14

#include <stdio.h>
void increment(int x)
{
	x = x + 1;
        
}

int main(void)
{
	int i = 1, j = 2;
	increment(i); 
        printf("i=%d\n",i);
	increment(j); 
        printf("j=%d\n",j);
	return 0;
}

编译 运行
x=1
y=2


caozhijie czj627@126.com
2011-12-22 23:22:27

#include <stdio.h>
void increment(int x)
{
	x = x + 1;
        printf("%d\n",x);

}

int main(void)
{
	int i = 1, j = 2;
	increment(i); 
    
	increment(j); 
       
	return 0;
}


编译 运行
2
3


caozhijie czj627@126.com
2011-12-22 23:42:57

如何解释:
我传了一个1进去,打印出2

这个2最终是通过:printf("占位符",变量);这样的形式被打印出来的

那么存放2的这个变量(指上面括弧中“变量“两字所指的东西)是哪个变量呢?既然不是i,j,x?


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!