1.1 入门
学习一门新程序设计语言的唯一途径就是使用它编写程序。对于所有语言的初学者来说编写的第一个程序几乎都是相同的,即
请打印出下列内容
hello, world
尽管这个练习很简单,但对于初学语言的人来说,它仍然可能成为一大障碍,因为要实现这个目的,我们首先必须编写程序文本,然后成功地进行编译,并加载、运行,最后输出到某个地方。掌握了这些操作细节以后,其他事情就比较容易了。在C语言中,我们可以用下列程序打印“hello,world”:
下面对程序本身做些说明。一个C语言程序,无论其大小如何,都是由函数和变量组成的,函数中包含一些语句,以指定所要执行的计算操作,变量则用于存储计算过程中使用的值。C语言中的函数类似于Fortran语言中的子程序和函数,与Pascal语言中的过程和的数也很类似。在本例中,函数的名字为main。通常情况下,函数的命名没有限制,但main是一个特殊的函数名——每个程序都从main函数的起点开始执行,这意味着每个程序都必须在某个位置包含一个main函数。
main函数通常会调用其他函数来帮助完成某些工作,被调用的函数可以是程序设计人员自己编写的,也可以来自于函数库。上述程序段中的第一行语句
#include <stdio.h>
用于告诉编译器在本程序中包含标准输入/输出库的信息。许多C语言源程序的开始处都包含这一行语句。
函数之间进行数据交换的一种方法是调用函数向被调用函数提供一个值(称为参数)列表。函数名后面的一对圆括号将参数列表括起来。在本例中,main函数不需要任何参数、因此用空参数表()表示。
函数中的语句用一对花括号()括起来。本例中的main函数仅包含下面一条语句:
printf("hello,world\n");
调用函数时,只需要使用函数名加上用圆括号括起来的参数表即可。上面这条语句将"hello,world\n"作为参数调用printf函数。printf是一个用于打印输出的库函数,在此处,它打印双引号中间的字符串。
用双引号括起来的字符序列称为字符串或字符串常量,如"hel1o,world\n"就是个字符申。目前我们仅使用字符串作为printf以及其他函数的参数。
在C语言中,字符序列\n表示换行符,在打印中遇到它时,打印输出将换行,从下一行的左端行首开始。如果去掉字符串中的\n(这是个值得一做的练习),即使打印输出完成后也不会换行。在printf函数的参数中,只能用\n表示换行符。如果用程序的换行代替\n,例如:
C编译器将会产生一条错误信息。
printf函数永远不会自动换行,这样我们可以多次调用该函数以分阶段得到一个长的输出行。上面给出的第一个程序也可以改写成下列形式:
这段程序与前面程序的输出相同。
请注意,\n只代表一个字符。类似于\n的转义字符序列为表示无法输入的字符或不可见字符提供了一种通用的可扩充的机制。除此之外,C语言提供的转义字符序列还包括:\t表示制表符;\b表示回退符;\"表示双引号;\\表示反斜杠符本身。
练习:
1.2 变量与数学表达式
变量是在编程中用来存储数据的一种方法。它们可以用来代表数值、字符串、布尔值等不同的数据类型。在数学表达式中,变量可以被用来代表未知数,使得我们可以在不知道具体数值的情况下进行计算。
一个数学表达式通常由运算符(如 +、-、*、/)和变量或常量组成。变量在表达式中可以进行各种数学运算,如加法、减法、乘法、除法等。例如,表达式 x + 5 代表 x 加上 5 的值。
变量在编程中可以使用赋值操作符(=)来赋值。通过将一个具体的数值或其他变量赋给一个变量,我们可以使用该变量来进行后续的计算。
例如,假设我们有两个变量 x 和 y,并且想求它们的和。我们可以使用数学表达式 x + y 来表示它们的和。然后,我们可以使用赋值操作符将具体的数值赋给这两个变量,如 x = 4 和 y = 6。然后,我们可以使用表达式 x + y 来求它们的和,得到结果 10。
1.3 for语句
for循环是编程语言中一种循环语句,而循环语句由循环体及循环的判定条件两部分组成,其表达式为:for(单次表达式;条件表达式;末尾循环体){中间循环体;}。
1.语句最简形式为:
for( ; ; )
2.一般形式为:
for(单次表达式;条件表达式;末尾循环体)
{
中间循环体;
}
for ( init; condition; increment ){ statement(s);}
其中,表示式皆可以省略,但分号不可省略,因为“;”可以代表一个空语句,省略了之后语句减少,即为语句格式发生变化,则编译器不能识别而无法进行编译。 [1]
for循环小括号里第一个“;”号前为一个为不参与循环的单次表达式,其可作为某一变量的初始化赋值语句, 用来给循环控制变量赋初值; 也可用来计算其它与for循环无关但先于循环部分处理的一个表达式。
“;”号之间的条件表达是一个关系表达式,其为循环的正式开端,当条件表达式成立时执行中间循环体。
执行的中间循环体可以为一个语句,也可以为多个语句,当中间循环体只有一个语句时,其大括号{}可以省略,执行完中间循环体后接着执行末尾循环体。
执行末尾循环体后将再次进行条件判断,若条件还成立,则继续重复上述循环,当条件不成立时则跳出当下for循环。
while循环和for循环区别
while循环的表达式为:while(表达式){循环体}
while循环当满足条件时进入循环,进入循环后,当条件不满足时,执行完循环体内全部语句后再跳出,而不是立即跳出循环(计算条件不满足时,也仍会执行完当前循环)。
while循环的语法为:while (<条件>) {需执行的代码 }。
for循环执行末尾循环体后将再次进行条件判断,若条件还成立,则继续重复上述循环,当条件不成立时则跳出当下for循环(遇到不满足的条件就立刻退出)。
for循环的语法为:for (变量 = 开始值;变量 <= 结束值;变量 = 变量 + 步进值) {需执行的代码 }。
1.4 符号常量
符号常量是在计算机程序中使用的一种特殊变量类型。它们是具有固定值的常量,一旦定义就无法更改。符号常量在程序中使用时不需要进行计算,而只需要使用它们的名称。
在许多编程语言中,符号常量使用关键字 const
或 final
来定义,并且通常在程序的顶部或模块的开头进行定义。符号常量的命名通常使用大写字母,以便与其他变量区分开来。
符号常量的主要优点是它们可以提高程序的可读性和可维护性。通过使用符号常量,程序员可以使用具有描述性名称的常量,而不是在代码中直接使用具体的数值。这样做可以使代码更易于理解和修改,因为常量的含义更加清晰。此外,如果需要更改常量的值,只需要修改一处定义,而不需要在整个程序中查找和更改多个实例。
符号常量通过预处理命令#define
进行定义,其一般形式为:
#define 标识符 常量值
例如:
#define PI 3.14
在程序中所有出现PI
的地方都会被替换为3.14
。
1.5 字符输入/输出
字符输入/输出(Character Input/Output)是指在计算机程序中进行字符数据的输入和输出操作。字符输入通常是从外部设备(如键盘、鼠标)或文件中读取字符数据,而字符输出则是将字符数据输出到显示屏、文件或其他设备中。
在大多数编程语言中,都提供了相应的字符输入/输出函数或类来实现字符输入/输出操作。常用的字符输入/输出函数包括:
- getchar(): 从标准输入流中获取一个字符。
- gets(): 从标准输入流中获取一行字符。
- scanf(): 格式化输入函数,可以按照指定格式从输入流中获取字符。
- fgetc(): 从文件中获取一个字符。
常用的字符输出函数包括:
- putchar(): 将一个字符输出到标准输出流。
- puts(): 将一个字符串输出到标准输出流。
- printf(): 格式化输出函数,可以按照指定格式将字符输出到输出流中。
- fputc(): 将一个字符输出到文件中。
在进行字符输入/输出操作时,需要注意输入输出流的打开和关闭,以及错误处理等问题,以确保程序能够正确读取和输出字符数据。
1.6 数组
在C语言中,数组是一种数据结构,它可以存储一系列相同类型的数据。数组中的每个元素都有一个索引,索引通常从0开始,并且可以通过索引访问数组中的每个元素。
以下是一些使用C语言数组的常见方法:
创建和初始化数组
int arr[5] = {1, 2, 3, 4, 5}; // 创建并初始化一个整型数组
访问数组元素
int firstElement = arr[0]; // 访问第一个元素
遍历数组
for(int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
修改数组元素
arr[1] = 10; // 将第二个元素修改为10
计算数组长度
int length = sizeof(arr) / sizeof(arr[0]);
1.7 函数
C语言中的函数等价于Fortran语言中的子程序或函数,也等价于Pascal语言中的过程或函数。函数为计算的封装提供了一种简便的方法,此后使用函数时不需要考虑它是如何实现的。使用设计正确的函数,程序员无须考虑功能是如何实现的,而只需要知道它具有哪些功能就够了。在C语言中可以简单、方便、高效地使用函数。我们经常会看到在定义后仅调用了一次的短函数,这样做可以使代码段更清晰易读。
函数定义可以以任意次序出现在一个源文件或多个源文件中,但同一函数不能分割存放在多个文件中
我们通常把函数定义中圆括号内出现的变量叫形式参数,而把函数调用中与形式参数对应的值叫实际参数
return 后面可以跟任何表达式,
return 表达式函数不一定都有返回值,不带表达式的return语句将控制权返回给调用者,但不返回有用的值
main本身也是函数,因此也可以向其调用都返回一个值,该调用者就是程序的执行环境,一般来说,返回值为0表示正常终止,返回值为非0表示出现异常情况或出错结束
1.8 参数——传值调用
在C语言中,函数的参数传递有两种方式:传值调用和传地址调用。传值调用是最常见的一种,它将函数外的变量的值复制到函数内部的参数中。
传值调用的优点是简单,参数的改变不会影响到函数外部的变量。但是,如果参数是结构体或者数组,由于参数的大小可能很大,这样的复制会导致性能的下降。
以下是一个使用传值调用的例子:
#include <stdio.h>
void swap(int a, int b) {
int temp;
temp = a; /* 保存a的值 */
a = b; /* 把b的值赋给a */
b = temp; /* 把temp的值赋给b */
printf("在swap函数内部,a的值为:%d,b的值为:%d\n", a, b);
}
int main() {
int x = 10;
int y = 20;
printf("在main函数中,在调用swap前,x的值为:%d,y的值为:%d\n", x, y);
swap(x, y); /* 调用swap函数 */
printf("在main函数中,在调用swap后,x的值为:%d,y的值为:%d\n", x, y);
return 0;
}
在上述代码中,我们定义了一个swap函数,它接受两个整型参数。在main函数中,我们声明了两个变量x和y,并分别赋值为10和20。然后我们调用swap函数,并将x和y作为参数传递。在swap函数内部,我们交换了a和b的值。但是,在函数外部,x和y的值并未改变。
输出结果为:
在main函数中,在调用swap前,x的值为:10,y的值为:20
在swap函数内部,a的值为:20,b的值为:10
在main函数中,在调用swap后,x的值为:10,y的值为:20
可以看到,即使在swap函数内部a和b的值发生了变化,但是x和y的值并未受到影响。这是因为在C语言中,函数参数的传递默认采用的是传值调用。
1.9 字符数组
在C语言中,字符数组是用于存储字符数据的数组。字符数组可以是字符串,也可以是单个字符的序列。
以下是一些处理C语言中字符数组的常见方法:
定义和初始化字符数组:
char charArray1[10] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
char charArray2[10] = "Hello World";
使用strlen()函数获取字符串长度:
int length = strlen(charArray1);
printf("Length of string is: %d", length);
使用strcpy()函数复制字符串:
char dest[50];
strcpy(dest, charArray1);
printf("Copied string: %s", dest);
使用strcat()函数连接字符串:
char string1[50] = "Hello";
char string2[50] = " World";
strcat(string1, string2);
printf("Concatenated string: %s", string1);
使用strcmp()函数比较字符串:
char string1[50] = "Hello";
char string2[50] = "World";
if(strcmp(string1, string2) == 0)
printf("Strings are equal");
else
printf("Strings are not equal");
使用strncpy()函数复制字符串的一部分:
char dest[50];
strncpy(dest, charArray1, 5);
printf("Copied part of string: %s", dest);
使用strncat()函数连接字符串的一部分:
char string1[50] = "Hello";
char string2[50] = "World";
strncat(string1, string2, 5);
printf("Concatenated part of string: %s", string1);
使用strtok()函数分割字符串:
char string[50] = "Hello World";
char seps[] = " ";
char *token;
token = strtok(string, seps);
while(token != NULL) {
printf("%s\n", token);
token = strtok(NULL, seps);
}
使用strchr()和strrchr()函数查找字符在字符串中的位置:
char string[50] = "Hello World";
char ch = 'W';
char *ret = strchr(string, ch);
if (ret == NULL)
printf("The character was not found\n");
else
printf("The character was found at: %d\n", (int)(ret - string + 1));
使用sprintf()函数将各种类型的数据格式化为字符串:
char buffer[50];
int intValue = 100;
sprintf(buffer, "Integer: %d", intValue);
printf("Formatted string: %s", buffer);
1.10 外部常量与作用域
外部常量是在函数外部定义的常量,可以被整个程序使用。外部常量的作用域是整个程序,即在任何地方都可以访问。
外部常量的作用域是全局的,这意味着它们可以在程序的任何地方使用。在使用外部常量之前,需要先在程序中进行声明。声明常量的方式是在常量的前面加上关键字"extern",然后再进行定义。
外部常量的作用域可以通过使用extern关键字来限定,只在特定的文件中可见。在其他文件中,可以使用extern关键字再次声明该常量,从而可以在其他文件中使用它。
需要注意的是,外部常量只能在定义它的文件中进行初始化,不能在其他文件中进行初始化。
总的来说,外部常量具有全局作用域,可以在程序的任何地方访问。
标签:字符,常量,第一章,char,导言,printf,程序设计,表达式,函数 From: https://blog.csdn.net/chenwinsagain/article/details/143452111