C语言学习笔记


2022年6月30日周四

(一)简单C程序的格式

#include<stdio.h>

int main(void){

    语句;
    
    return 0;
}
//大部分语句都是以分号结尾。

 (二)提高程序可读性的技巧

1.选择有意义的函数名和变量名。

2.写注释。

3.在函数中用空格分隔概念上的多个部分,如声明和其他部分分开。

4.每条语句都各占一行。

(三)C90后的新版函数

函数原型(函数声明),函数定义,函数调用。

C标准建议,要为程序中用到的所有函数提供函数原型。标准include文件(包含文件)为标准库函数提供可函数原型。例如,在C标准中,stdio.h 文件包含了printf()的函数原型。
/*two_func.c--一个文件中包含两个函数*/
#include<stdio.h>

void butler(void);//C函数原型

int main(){

    printf("I will summon the butler function.\n");

    butler();

    printf("Yes.Bring me some tea and writeable DVDs.\n");

    return 0;

}

void butler(){

    printf("You rang,sir?\n");

}

(四)所有C程序都从main()开始执行

2022年7月1日周五

(一)程序调试的方法

编译器可以检测出语法错误,但是程序里的语义错误只有在编译完之后才能从程序的行为中表现出来。检查程序是否有语义错误要跟踪程序的状态,即程序每执行一步后所有变量的值。

1.自己模拟计算机逐步执行程序。

        但是,如果程序中有10000次循环,这种方法恐怕行不通。不过,可以跟踪一小部分循环,看看程序是否按照预期的方式执行。

2.在程序中的关键点插入额外的 printf() 语句,以监视制定变量值的变化。

        通过查看值的变化可以了解程序的执行情况。对程序的执行满意后,便可删除额外的 printf()语句,然后重新编译。

3.使用调试器。

调试器(debugger)是一种程序,让你一步一步运行另一个程序,并检查该程序变量的值。调试器有不同的使用难度和复杂度。较高级的调试器会显示正在执行的源代码行号。这在检查有多条执行路径的程序时很方便,因为很容易知道正在执行哪条路 径。

(二)关键字和保留标识符

1.关键字是C语言的词汇。它们对C而言比较特殊,不能用它们作为标识 符(如,变量名)。如果使用关键字不当(如,用关键字作为变量名),编译器会将其视为 语法错误。

2.还有一些保留标识符(reserved identifier),C语言已经指定了它 们的用途或保留它们的使用权,如果你使用这些标识符来表示其他意思会导致一些问题。因此,尽管它们也是有效的名称,不会引起语法错误,也不能随便使用。保留标识符包括那些以下划线字符开头的标识符和标准库函数 名,如printf()

 (三)练习题

/*1.编写一个程序把你的年龄转换成天数,并显示这两个值。*/

#include<stdio.h>

int main(){

    int olds=0;
    int days=0;
    int year=0;

    scanf("%d",&olds);

    year=2022-olds;

    for(int i=year;i<2022;i++){
        //闰年的判断条件:能被4整除但不能被100整除,或者能被400整除
        if((i%4==0&&i%100!=0)||i%400==0)
        {

            days+=366;

            printf("%d ",i);//输出从出生起到目前为止所有的闰年

        }else{

            days+=365;

        }
    }
    
    printf("\n");
    printf("年龄%d岁,天数%d天",olds,days);

    return 0;

}

/*2.编写一个程序,生成以下输出: 
For he's a jolly good fellow! 
For he's a jolly good fellow! 
For he's a jolly good fellow! 
Which nobody can deny! 
除了 main()函数以外,该程序还要调用两个自定义函数:一个名为jolly(),
用于打印前 3 条消息,调用一次打印一条;另一个函数名为 deny(),打印最后一条消息。*/

#include<stdio.h>

void jolly(void);//函数原型(函数声明)
void deny(void);

int main(){

    jolly();//函数调用
    jolly();
    jolly();
    deny();

    return 0;

}

/*函数声明*/
void jolly(){

    printf("For he's a jolly good fellow!\n");

}

void deny(){

    printf("Which nobody can deny!");

}

/*3.编写一个程序,整创建一个型变量toes,并将toes设置为10。
程序中还要计算toes的两倍和toes的平方。该程序应打印3个值,并分别描述以示区分。*/

#include<stdio.h>

int main(){

    int toes;

    toes=10;

    printf("toes is %d,double toes is %d,square toes is %d",toes,toes*2,toes*toes);

    return 0;
    
}

/*4.许多研究表明,微笑益处多多。编写一个程序,生成以下格式的输出:
Smile!Smile!Smile! 
Smile!Smile! 
Smile! 
该程序要定义一个函数,该函数被调用一次打印一次“Smile!”,根据程序的需要使用该函数。*/

#include<stdio.h>

void smile();

int main(){

    //外层循环表示行数
    for(int i=0;i<3;i++){
        //内层循环表示列数
        for(int j=3;j>i;j--){

            smile();

        }

        printf("\n");
        
    }

    return 0;

}

void smile(){

    printf("Smile!");

}

2022年7月2日周六

(一)输入

scanf("%f", &weight);
scanf() 函数用于读取键盘的输入。 %f 说明 scanf() 要读取用户从键盘输入的浮点数,&weight 告诉 scanf() 把输入的值赋给名为 weight 的变量。 scanf() 函数使用& 符号表明找到 weight 变量的地点。

(二)常量和变量

有些数据类型在程序使用之前已经预先设定好了,在整 个程序的运行过程中没有变化,这些称为常量(constant)。
其他数据类型 在程序运行期间可能会改变或被赋值,这些称为变量(variable)。
如果数据是常量,编译器 一般通过用户书写的形式来识别类型(如,42 是整数, 42.100 是浮点数)。 但是,对变量而言,要在声明时指定其类型。

(三)数据类型关键字

 _Bool类型表示布尔值(true或false), _complex和_Imaginary分别表示复数和虚数。

2022年7月4日

(一)变量如何获得值?

1 种途径是赋值: cows = 112;
2 种途径是,通过函数(如, scanf() )获得值。
3 种途径是,初始化变量。在C 语言中,初始化可以直接在声明中完成。只需在变量名后面加上赋值运算符(=)和待赋 给变量的值即可。如: int hogs = 21;
简而言之,这种声明不仅为变量创建和标记存储空间,并为其指定初始值(如图 3.4所示)
注:最好不要把初始化的变量和未初始化的变量放在同一条声明中。
int dogs, cats = 94; /* 有效,但是这种格式很糟糕 */

(二)八进制和十六进制

通常, C 语言都假定整型常量是十进制数。然而,许多程序员很喜欢使用八进制和十六进制数。
C 语言中,用特定的前缀表示使用哪种进制。 0x 0X 前缀表示十六进 制值,所以十进制数16 表示成十六进制是 0x10 0X10 。与此类似, 0 前缀表 示八进制。例如,十进制数16 表示成八进制是 020
注:使用不同的进制数是为了方便,不会影响数被储存的方式。也就是说,无论把数字写成16、020或0x10,储存该数的方式都相同,因为计算机内部都以二进制进行编码。

2022年7月4日

(一)显示八进制和十六进制

不同的进制要使用不同 的转换说明。
以十进制显示数字,使用%d
以八进制显示数字,使用 %o
以十六进制显示数字,使用 %x
另外,要显示各进制数的前缀 0 0x 0X , 必须分别使用%#o %#x %#X

显示案例

/* bases.c--以十进制、八进制、十六进制打印十进制数100 */

#include<stdio.h>

int main(){

    int x=100;

    printf("dec=%d,octal=%o,hex=%x\n",x,x,x);

    printf("dec=%d,octal=%#o,hex=%#x\n",x,x,x);

    return 0;
}

(二)C语言提供3个附属关键字修饰基本整数类型:shortlongunsigned

short int 类型(或者简写为 short )占用的存储空间可能比 int 类型少,常 用于较小数值的场合以节省空间。与int 类似, short 是有符号类型。
long int或 long 占用的存储空间可能比 int 多,适用于较大数值的场合。与 int类似, long 是有符号类型。
long long int long long C99 标准加入)占用的储存空间可能比 long 多, 适用于更大数值的场合。该类型至少占64 位。与 int 类似, long long 是有符号类型。
unsigned int unsigned 只用于非负值的场合。这种类型与有符号类型表 示的范围不同。例如,16 unsigned int允许的取值范围是 0 65535 ,而不 是-32768 32767 。用于表示正负号的位现在用于表示另一个二进制位,所 以无符号整型可以表示更大的数。
C90 标准中,添加了 unsigned long int unsigned long unsigned int 或 unsigned short类型 C99 标准又添加了 unsigned long long int unsigned long long。
在任何有符号类型前面添加关键字 signed ,可强调使用有符号类型的意图。例如,short、short int、signed short、signed short int都表示同一种类型。
在支持 long long 类型的系统中,也可以使用 ll LL 后缀来表示 long long类型的值,如 3LL 。另外, u U 后缀表示 unsigned long long ,如 5ull、 10LLU 6LLU 9Ull

(三)整数溢出

/*超出系统允许的最大整数值*/

#include<stdio.h>

int main(){

    int i=2147483647;
    unsigned int j=4294967295;

    printf("%d %d %d\n",i,i+1,i+2);
    printf("%u %u %u\n",j,j+1,j+2);
    
    return 0;
}
它们主要的区别是,在超过最大值时,unsigned int 类型的变量 j 0 开始;而 int 类型的变量 i 则从
−2147483648 开始。注意,当 i 超出(溢出)其相应类型所能表示的最大值 时,系统并未通知用户。因此,在编程时必须自己注意这类问题。

(四)打印shortlonglong longunsigned类型

打印 unsigned int类型的值,使用 %u 转换说明;打印 long 类型的值,使用%ld转换说明。
如果系统中 int long 的大小相同,使用 %d 就行。但是,这样的程序被移植到其他系统(int和 long 类型的大小不同)中会无法正常工作。
x o 前面可以使用 l 前缀, %lx 表示以十六进制格式打印 long 类型整数,%lo 表示以八进制格式打印 long 类型整数。注意,虽然 C 允许使用大写或小写的常量后缀,但是在转换说明中只能用小写。
C语言有多种 printf() 格式。对于 short 类型,可以使用 h 前缀。 %hd 表示以 十进制显示short 类型的整数, %ho 表示以八进制显示 short 类型的整数。 h l 前缀都可以和u 一起使用,用于表示无符号类型。例如, %lu 表示打印 unsigned long类型的值。

打印练习

/* 更多printf()的特性,打印不同类型的整型*/

#include<stdio.h>

int main(){

    unsigned int un=3000000000;

    short end=300;

    long big=65537;

    long long verybig=12345678908642;

    printf("un=%u and not %d\n",un,un);/* int为32位和short为16位的系统 */

    printf("end=%hd and %d\n",end,end);

    printf("big=%ld and not %hd\n",big,big);

    printf("verybig=%lld and not %ld\n",verybig,verybig);

    return 0;
    
}

运行结果

 

该例表明,使用错误的转换说明会得到意想不到的结果。
1 行输出, 对于无符号变量 un ,使用 %d 会生成负值!其原因是,无符号值 3000000000 和有符号值−129496296 在系统内存中的内部表示完全相同。因此,如果告诉 printf() 该数是无符号数,它打印一个值;如果告诉它 该数是有符号数,它将打印另一个值。在待打印的值大于有符号值的最大值时,会发生这种情况。对于较小的正数(如96 ),有符号和无符号类型的存储、显示都相同。
2 行输出,对于 short 类型的变量 end ,在 printf() 中无论指定以 short 类型(%hd )还是 int 类型( %d )打印,打印出来的值都相同。这是因为在给函数传递参数时,C 编译器把 short 类型的值自动转换成 int 类型的值。你可能会提出疑问:为什么要进行转换?h 修饰符有什么用?第 1 个问题的答案是,int类型被认为是计算机处理整数类型时最高效的类型。因此,在 short int 类型的大小不同的计算机中,用int 类型的参数传递速度更快。第 2 个问题的答案是,使用h 修饰符可以显示较大整数被截断成 short 类型值的情况。第 3 行输出就演示了这种情况。把 65537 以二进制格式写成一个 32 位数是00000000000000010000000000000001。使用 %hd printf() 只会查看后 16 位,所以显示的值是 1
与此类似,输出的最后一行先显示了 verybig 的完整值,然后由于使用了%ld printf() 只显示了储存在后 32 位的值。
在使用 printf() 函数时,切记检查每个待打印值都有对应的转换说明,还要检查转换说明的类型是否与待打印值的类型相匹配。

(五)声明char类型变量

char 类型变量的声明方式与其他类型变量的声明方式相同。下面是一些
例子:
char response;
char itable, latan;
以上声明创建了 3 char 类型的变量: response itable latan

(六)字符常量和初始化

在C 语言中,用单引号括起来的单个字符被称为字符常量(character constant)实际上,字符是以数值形式储存的,所以也可使用数字代码值来赋值: char grade = 65;char 通常,类型被定义为8位的存储单元,定义一个字符常 量'FATE' ,即把 4 个独立的 8 ASCII 码储存在一个 32 位存储单元中。如果把这样的字符常量赋给char 类型变量 grade ,只有最后 8 位有效。因此, grade 的值是'E'

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值