黑马程序员--C语言之基本语法、算法和进制

来源:互联网 发布:java编译器 编辑:程序博客网 时间:2024/06/12 22:21

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

C语言的学习过程大致上包括基本语法、基本运算、流程控制等。本篇博客先总结下C语言的基本语法。

使用工具:Xcode5.1.1


C程序结构:

1、编写程序

2、编译(用来检查语法正误)

3、链接(把所有的可执行.o格式文件与C语言数据库链接成一个可执行文件)

4、运行

图像化表示:



例:

//编写代码:终端输入指令

touch 01-program1.c//新建program1的c文件

open 01-program1.c//打开program1文件


//对program1.c进行编辑#include <stdio.h>int main(){int a=100;int b=99;int temp=a;a=b;b=temp;printf("%d\n%d",a,b);return 0;}



//情形一:编译和链接分布执行:

//编译:终端输入指令

cc -c program1.c//编译.c文件,如果成功便生出.o文件(可以同时编译多个.c文件)

//链接:终端输入指令

cc program1.o //将program1.o与c语言数据库链接,如果成功,默认生成一个a.out文件(可以同时链接多个.o文件)

//情形二:编译和链接同时执行:

//编译并链接:终端输入指令

cc program1.c//直接将program1.c编译并与数据库链接(可以同时编译并链接多个.c文件)


//运行:终端输入指令

./a.out //运行a.out,显示结果


C基本语法:

分号作用:用来分开语句。

注释作用:对某段程序进行注释说明,注释不会被运行,根据这一特性也可用来排除故障。

标志符:C语言标志符是用来标识变量、函数名称或任何其它用户指定的项目。标志符以字母或下划线开头,由0个或多个字母、下划线和数字构成。

关键字:C语言中有32个关键字。

空白行:例: int a ;//在int和a中间必须有空白行。

a = b + c ;//这中间的空白行是为了美观

注意事项:

1、对于文件名中有空格的处理(处理方法:在终端中空格前面按tab键,或者在空格位置用"\ "替换)

2、编程时注意中英文切换引起的符号错误(可通过编译来找出错误)

3、编程用到多个方法,main方法在最上面时应该先声明各方法。

例:

#include <stdio.h>int sample();//此为声明方法int main(){sample();return 0;}int sample(){printf("请输入你的序号:");int a=0;scanf("%d",&a);printf("你的下一个序号为%d",a+1);return 0;}


4、.o文件的生成路径是在编辑的路径下。例:cc -c desktop/progeam1.c  生产.o的目录并不是01-示例.c的目录

5、生产.out文件的重命名,在终端的命令以cc filename.c/.o -0 anotherName。例:cc program1.c -0 test1

6、解决错误的总体思路:

<1>语法错误:通过编译器的调试解决;

<2>逻辑错误:需要耐心调试(可以通过注释排除故障)

7、scanf只能接受变量的地址,在用到变量时须加上&。例:scanf("%d",&a);

8、标识符用时不能与关键字通明,标识符过长时用驼峰标识表示。

例:

#include <stdio.h>int stuId(){return 9;}int stuAge(){return 22;} int main(){int id=stuId();int age=stuAge();printf("学号为%d,年龄为%d",id,age);return 0;}



9、使用变量时应注意变量的作用范围。

10、变量在内存中的存储按从大到小的顺序。

例:

int a=0;

int b=1;

a的内存地址比b的内存地址高出4(int所占4字节)


附加终端常用指令:

1、ls 参数或文件目录;ls -w:显示中文;ls -l:详细信息;ls-a:列出包括隐藏文件

2、cd 用作转换目录

3、mkdir 用来建立新目录

4、pwd 显示当前目录和路径名

5、clear 为清空控制台

6、touch file/open file 为创建/打开文件


算术运算:

加:+、减:-、乘:*、取整:/、取余:%

例:a、b的运算结果

#include <stdio.h>int main(){int a=88;int b=10;int sum=a+b;//加法运算int minus=a-b;//减法运算int mutiply=a*b;//乘法运算int divide=a/b;//取整运算int quyu=a%b;//取余运算printf("加法运算:%d,减法运算:%d,乘法运算:%d,取整运算:%d,取余运算:%d",sum,minus,mutiply,divide,quyu);return 0;}



关系运算:

大于:>、小于:<、大于等于:>=、小于等于:<=、等于:==、不等于:!=(关系运算多用于条件语句和循环语句,c语言中关系运算结果为“0”或“1”)

例:判断a是否大于b

#include <stdio.h>int main(){int a= 888 ;int b= 88 ;int result = a > b ;printf (" a > b 的结果为%d",result);return 0;}


逻辑运算:

与:&&、或:||、非:!(逻辑运算一般也用于条件语句和循环语句,结果也为“0”或“1”)

例:判断a是否是a、b、c三个数中最大的

#include <stdio.h>int main(){int a = 12 ;int b = 13 ;int c = 14 ;int result = a > b && b > c  ;printf("a,b,c三个数a是否为最大:%d",result);return 0;}



三目运算:

条件 ? num1/char1... : num2/char2...

例:找出a,b中的较大值。

#include <stdio.h>int main(){int a , b ;int max = a > b ? 100 : 50 ;printf("a,b中大的数是:%d",max);return 0;}


位运算:(需转换为二进制)

左移:<<、右移:>>、按位与:&、按位或:|、按位取反:~、按位异:^

1<<16意为:16的二进制表示形式0b10000向左移一位,相当于十进制的16/2.

16>>1意为:16的二进制表示形式0b10000向右移一位,相当于十进制的16*2.

16&15意为:16的二进制表示形式0b10000与15的二进制表示形式0b1111,如果同位数的值相同为1,不同为0,结果为0

16|15意为:16的二进制表示形式0b10000与15的二进制表示形式0b1111,同位数只要有一个是1,那么该位就是1,同位数都是0,那么就是0,结果为0b11111即31

~16意为:16的二进制表示形式0b0000 0000 0000 0000 0000 0000 0001 0000,每位都取反,结果为0b1111 1111 1111 1111 1111 1111 1110 1111即-17

16^15意为:16的二进制表示形式0b10000与15的二进制表示形式0b1111,同位数相同为0,不同为1,结果为0b11111即31

16^31:16的二进制表示形式0b10000与31的二进制表示形式0b11111,结果为0b1111即15,发现16^15^16 = 15

例:a、b的数值互换

#include <stdio.h>int main(){int a= 99 ;int b= 5 ;a = a ^ b ;b = a ^b ;a = a ^b ;printf("交换后a、b数值为:%d,%d",a,b);return 0;}


其它运算符:

1、sizeof:用来表示所占字节数。

例:

#include <stdio.h>int main(){int a = 10 ;printf("a占%d字节",sizeof(a));//在这里a是int类型变量,也可写成sizeof areturn 0;}


sizeof使用注意:

sizeof(int)是允许的,但是sizeof int为错误写法


2、&:取出变量的内存地址。具体用在:直接取内存地址、用到scanf时、指针等

例:

#include <stdio.h>int main(){    int a = 10;    printf("%p",&a);//取内存地址时要用%p    return 0;}



注意事项:

1、用到基本算法的时候必须注意符号的优先级

2、数据的隐式转换和显式转换,类型转换最好是由低到高

例:a、b两数的隐式转换和显示转换及输出结果

#include <stdio.h>int main(){double a= 10 ;//a为idouble类型,右边值为int类型,是隐式转换(自动类型转换),而a的结果为10.000000int b = (int) 10.55;//b为int类型,右边是double类型,是显示转换(强制类型转换),必须要加上(int),b结果为10printf("%f,%d",a,b);return 0;}


3、++a与a++在运算时的区别:区别在参与运算时,++a会把自加后的值参与运算;a++则不会

例:a++和++a参与运算的示例

#include <stdio.h>int main(){int a = 15 ;int b = (a++)+(++a);printf("a和b的值分别为:%d,%d",a,b);return 0;}



4、逻辑运算的 && 当前面一个条件不满足时,后面的不会执行;|| 第一个条件满足后,后面的条件也不会执行

例:打印a、b、c、d 的值

#include <stdio.h>int main(){int a = 10 ;int b = 11 ;int c = 12 ;int d = 13 ;1 > 0 && a++ ;1 < 0 && b++ ;1 < 0 && c++ ;1 > 0 && d++ >100 ;printf("a、b、c、d的值分别为:%d,%d,%d,%d",a,b,c,d);return 0;}


5、C语言中”真“、”假“是用”1“、”0“表示。

6、逻辑运算和位运算的区别:逻辑运算是对条件的判断;位运算是把十进制转换为二进制然后对数据进行操作


进制:

进制常用的有十进制、二进制、八进制、十六进制等。十进制的数字表示为0~9;二进制数字表示为0、1;八进制数字表示为0~7;十六进制表示为0~9,a~f 。


C语言中各进制表示如:

int a = 6 ; //默认定义是十进制

int b = 0b1101 ; //二进制以0B或0b开头

int c = 07 ; //八进制以0开头 

int d = 0x 16e ; //十六进制以0x或0X开头

其中以十进制和二进制应用频率最高。


十进制转二进制:

1、正整数十进制转二进制:

将需要转换的正整数一直除2取余,知道为0或1,右下到上将余数排列即可求出这个正整数的二进制表示。计算机中int 有32位,其中首位0代表正整数,1代表负数

例:

15的二进制表示为0000 0000 0000 0000 0000 0000 0000 1111

2、负数十进制转二进制;

1>原码:负数取绝对值用二进制表示。

例:-17取绝对值17,表示为 0000 0000 0000 0000 0000 0000 0001 0001

2>反码:得到绝对值二进制取反,例:17取反为 1111 1111 1111 1111 1111 1111 1110 1110

3>补码:取反数值补1,例:-17最后得到结果 1111 1111 1111 1111 1111 1111 1110 1111

二进制转十进制:

从右向左用二进制的每个数乘以2的对应次方。

例:

11101二进制转十进制1*2^0+0*2^1+1*2^2+1*2^3+1*2^4=29


0 0