C和指针第二章基本概念

问题答案

以下有一大部分均为个人观点,如有错误请指正。

第1题

在C语言中,注释不允许嵌套。在下面的代码段中,用注释来“注释掉”一段语句会导致什么结果?

void 
squares(  int limit  )
{
/* Comment  out  this  entire functio
		int 	   i;      /* loop counter */
		/*
		** Print table of squares
		*/
		for( i = 0; i < limit; i += 1 )
				printf( "%d %d0, i, i * i );
End of commented-out code */
}

相信有很多人看到这段代码的颜色就可以知道哪里出了问题,所以学习最好的方法就是上机。
首先 变量 i 没有被定义,最后那一段注释没有被注释掉,还有引号打成了0.

第2题

把一个大型程序放入一个单一的源文件中有什么优点?有什么缺点?
优点

  1. 编译时只需要编译一个文件
  2. 易于管理和维护
  3. 避免重复声明
  4. 适合个人开发

缺点

  1. 改一小部分,需要对整个程序重新编译
  2. 难以阅读和分析代码(可读性差)
  3. 不适合于团队开发
第3题

你需要用printf函数打印出下面这段文本(包括两边的双引号)。你应该使用什么样的字符串常量参数?

“Blunder??!??”

printf("\"Blunder??\!??\"");
第4题

\40的值是多少?\100、\x40、\x100、\0123、\x0123的值又分别是多少?

首先\ddd是八进制,\xddd是十六进制。
所以\40=32=空格字符
\100=64=’@’
\x40=64=’@’
\100占据12位(尽管前三位为零)。在绝大多数机器上,这个值关于庞大,无法存储于应该字符内,所以它的结果因编译器而异。
\0123 由两个字符组成,‘\012’和‘\3’.其结果值因编译器而异。 \x0123 过于庞大,无法存储于一个字符内,其结果值因编译器而异。

第5题

下面这条语句的结果是什么?

int  x/*blah  blah*/y;

变量y未被定义

第6题

下面的声明存在什么错误(如果有的话)?

int   Case,  If,  While,  Stop,  stop;

这段代码我试过在定义的时候没有问题,可能因为的编译器的原因,所以应该没有问题。
也可能是因为大小写的原因。
像while,if,case 本质上应该是不可以的(个人观点)

第7题

是非题:因为C(除了预处理指令之外)是一种自由形式的语言,唯一规定程序应如何编写的规则就是语法规则,所以程序实际看上去的样子无关紧要。

有对有错。对:除了预处理指令之外,语言并没有对程序应该出现的外观施加任何规则。
错:风格恶劣的程序难以维护或无法维护,所以除了极为简单的程序外,绝大多数程序的编写风格是非常重要的。

第8题

下面程序中的循环是否正确?

#include <stdio.h>

int 
main( void )
{
int       x, y;

x = 0; 
while( x < 10){
		y = x * x;
		printf( "%d\t%d\n" , x, y );
		x += 1;
}

这个程序中的循环是否正确?

#include <stdio.h>

int 
main( void )
{
			int       x, y;
			x = 0; 
			while( x < 10){
							y = x * x;
							printf( "%d\t%d\n" , x, y );
							x += 1;
}

哪个程序更易于检查其正确性?

这两个程序的while循环都缺少一个用于结束语句的右花括号。但是,第2个程序更容易发现这个错误。
这个例子说明了在函数中对语句进行缩进的价值,

第9题

假定你有一个C程序,它的main函数位于文件main.c,它还有一些函数位于文件list.creport.c。在编译和链接这个程序时,你应该使用什么命令?

大致像下面这个,我用的是ubuntu版的Linux

// 将函数封装成动态库,对子函数进行加密
1.先创建swap.c添加以下内容
#include <stdbool.h>
bool swap(int *a,int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
	return true;
}

2.创建main.c添加以下内容
#include <stdio.h>
#include <stdbool.h>
#include "swap.h" // 编译器自动的去程序的当前目录下找此头文件

int main()
{
	int a = 1,b = 2;
	swap(&a,&b);
	printf("(%d,%d)\n",a,b);
	return 0;
}

3.创建swap.h头文件添加以下内容
#ifndef _SWAP_H
#define _SWAP_H

// 函数声明
/*
* 参数 :a,b需要交换的两个整型数据
* 返回值
*	成功返回true
*	失败返回false

*/
extern bool swap(int *a,int *b);

#endif

4.将swap.c封装成动态库,在ubuntu执行
gcc swap.c -shared -o libswap.so

5.编译程序
gcc main.c libswap.so -o main

6.执行程序
./main
第10题

接上题,如果你想使程序链接到parse函数库,你应该对命令作何修改?

parse函数库和main.c文件放在同一个目录,然后再在头文件加上#include “parse.h”

第11题

假定你有一个C程序,它由几个单独的文件组成,而这几个文件又分别包含了其他文件,如下所示:

文件包含文件
main.cstdio.h , table.h
list.clist.h
symbol.csymbol.h
table.ctable.h
table.hsymbol.h , list.h

如果你对 list.c 作了修改,你应该用什么命令进行重新编译? 如果是list.h 或者table.h 作了修改,又分别应该使用了什么命令?

当一个头文件被修改时,所有包含它的文件都必须重新编译。

如果这个文件被修改这些文件必须重新编译
list.clist.c
list.hlist.c , table.c , main.c
table.htable.c , main.c

Borland C/C++编译器的Windows集成开发环境在各个文件中寻找这些关系并自动只编译那些需要重新编译的文件。
UNIX系统有一个称为make的工具,用于执行相同的任务。但是,要使用这个工具,你必须创建一个 “makefile” ,它用于描述各个文件之间的关系。

本章小结

三字母词(trigrph)

定义:几个字符的序列,合起来表示另外一个字符。

??([??<{??=#
??)]??>}??/\
??!|??’^??-~
转义序列或字符转义

转义序列由一个反斜杠\加上一或多个其他字符组成。

\ ?在书写l连续多个问号时使用,防止它们被解释为三字母词。
\ ''用于表示一个字符串常量内部的双引号。
\ \用于表示一个反斜杠,防止它被解释为一个转义序列符。

转义符

\b 退格键。
\f 进纸字符。
\r 回车符。
\t 水平制表符。
\v 垂直制表符。

标识符(identifier)

标识符就是常量、函数、类型等的名字。
它们由大小写字母、数字和下划线组成,但是不能以数字为开头
关键字不可作为标识符使用。

auto do goto signed unsigned
break double if sizeof void
case else int static volatile
char enum long strict while
const extern register switch
continue float return typedef
default for short union

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值