C语言简介:
1.编程语言发展历程: 机器语言-> 汇编语言(ASM) ->高级语言(C、C++、Java、ObjectC)->脚本语言 <HTML
JavaScript、ShellScript、PHP、JSP、ASP、Python、Perl)
2. C语言历史: Dennis M.Ritchie为保证UNIX操作系统在不同平台上方便移植而发明了C语言, C语言源自Ken Thompson发明的B语言,而B语言则源自BCPL语。
3.C语言标准: K&R C、 ANSI C/C89/C90、C94、C95、C99、C11标准
4.C语言特性: 高效性、可移植性 缺点:语言只是工具,程序员对自身代码负责<指针、越界>。
程序入门:
#include <stdio.h> // 单行注释:包含系统的头文件
int add(int a, int b); // 函数声明
int main(void)
{ // 花括号、程序体、代码块
int a = 500; // 定义变量初始化
int b; // 定义变量,那这时的值是多少?
b = 20; // 变量赋值
printf("Total: %d\n", add(a, b)); //函数调用
}
/* 返回 a+b 的值 */
int add(int a, int b)
{
return a+b;
}
关键字:
signed:有符号类型
unsigned: 无符号类型
char:字符类型,占一个字节
short:短整型,占2个字节
int:整型,占四个字节
double :变量以带符号的 IEEE 64 位(8 个字节)双精度浮点数形式存储
float:浮点类型的单精度值具有 4 个字节,
void :无类型
enum:枚举类型
union :联合类型
struct :结构体类型
volatile:volatile 影响编译器编译的结果,指出,volatile变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错
1>告诉compiler不能做任何优化
比如要往某一地址送两指令:
int *ip =...; //设备地址
*ip = 1; //第一个指令
*ip = 2; //第二个指令
以上程序compiler可能做优化而成:
int *ip = ...;
*ip = 2;
结果第一个指令丢失。如果用volatile, compiler就不允许做任何的优化,从而保证程序的原意:
volatile int *ip = ...;
*ip = 1;
*ip = 2;
即使你要compiler做优化,它也不会把两次付值语句间化为一。它只能做其它的优化。
2>用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。
例如:
volatile char a;
a=0;
while(!a){
//do some things;
}
doother();
如果没有 volatiledoother()不会被执行
auto变量:函数中的局部变量,如不专门声明static,一般都是动态地分配存储空间
static声明变量:用static声明的静态局部变量,在函数调用结束后不消失,反而保留当前的数据,在下一次该函数调用时,该变量现有的值就是上一次函数调用结束时的值。一般用static声明一个变量的作用有二:(1)对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在。(2)对全部变量用static声明,则该变量的作用域只限于本文件模块,即被声明的文件中。
const类型变量:
int i;const int *p;
int *const p=&i;
const int *const p=&i
1. const int *p——const用来修饰int *, *p的内容不可变, 比如你定义了const int *p=5; 那么你再对p的内容赋值就是不合法的:*p=6; // no!
2. int *const p=&i;——const用来修饰 p, 指针p的地址不可变, int i=0; int j; int *const p=&i; p=&j; // no! i=1; // ok!
3.const int *const p=&i——限制了指针指向的内容和指向的地址
register变量:一般变量的值都是存储在内存中,(当程序需要用到哪一个变量的值,由控制器发出指令将内存中该变量的值送到运算器,完了如果需要存数,再从运算器将数据送到内存中存放。)所以就引出一个问题,如果我们进行一段频繁的运算,则存储变量的值肯定要花费不少时间,所以C语言允许将局部变量的值存放在寄存器中,这样需要时就直接搬用,不必再进行过内存。提高运算速度。
extern声明外部变量:外部变量(即全局变量)是在函数的外部定义的。作用域为从变量的定义处开始,到本程序文件的结尾。可以在一个文件内声明外部变量
restrict:关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。
sizeof :C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。
语法格式 sizeof 有三种语法形式
1) 用于数据类型
sizeof( type_name ); // sizeof( 类型 );
2) 用于变量
sizeof ( object ); // sizeof( 对象 );
sizeof object; // sizeof 对象;
typedef:在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
if else :条件判断
if(number > 6)
if(number < 12)
printf("You're close!\n");
else
printf("Sorry, you lose a turn!\n");
for:循环语句
for(i=0; i<LIMIT; i++)
{
do_something;
}
while :循环语句,还有一个等同的语句do while
while(condition1)
{
while(condition2)
{
while(condition3)
{
do1;
continue; //break? // goto ?
do2;
}
do 3;
}
}
switch case:
switch(表达式) { case 常量表达式1:语句1; .... case 常量表达式2:语句2; default:语句; }
1.default就是如果没有符合的case就执行它,default并不是必须的.
2.case后的语句可以不用大括号. case 后面必须是常量表达式constant expressions, 错误表示如: case x .
3.switch语句的判断条件可以接受int,byte,char,short, enum不能接受其他类型.
4.一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break,利用这一特性可以让好几个case执行统一语句.
goto: goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
inline:inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。
C99关键字: _Bool(true false) _Complex _Imageubary
编程题:福利彩票双色球6+1
福利彩票双色球的6+1的意思就是6个红球(范围为1~33),一个蓝球(范围为1~16)。双色球
中奖规则:
一等奖:投注号码与当期开奖号码全部相同(顺序不限,下同),即中奖;
二等奖:投注号码与当期开奖号码中的6个红色球号码相同,即中奖;
三等奖:投注号码与当期开奖号码中的任意5个红色球号码和1个蓝色球号码相同,即中奖;
四等奖:投注号码与当期开奖号码中的任意5个红色球号码相同,或与任意4个红色球号码和1
个蓝色球号码相同,即中奖;
五等奖:投注号码与当期开奖号码中的任意4个红色球号码相同,或与任意3个红色球号码和1
个蓝色球号码相同,即中奖;
六等奖:投注号码与当期开奖号码中的1个蓝色球号码相同,即中奖。程序如下:
#include<time.h>
#include<stdlib.h>
int main(int argc, char** argv)
{
int red, blue;
int r[6], b[1];
int p=0,q=0;
int x=0, y=0;
int i, j; srand((unsigned)time(NULL));
printf("你的彩票号码是: 红球:\n");
for (i = 0; i < 6; i++)
{
scanf("%d", &r[i]);
}
printf("蓝球:");
for (j = 0; j < 1;j++)
{
scanf("%d", &b[j]);
}
printf("\n红球:");
while (p < 6)
{
red = rand() % 33 + 1;
printf("%4d", red);
if (red == r[i])
{
x++;
}
p++;
}
printf("\n蓝球:");
while (q < 1)
{
blue = rand() % 16 + 1;
printf("%d", blue);
if (blue == b[j])
{
y++;
}
q++;
}
if (x == 6 && y == 1)
printf("中了一等奖!");
else if(x == 6)
printf("中了二等奖!");
else if(x == 5 && y == 1)
printf("中了三等奖!");
else if((x == 5 && y == 0) || (x == 4 && y == 1))
printf("中了四等奖!");
else if((x == 4 && y == 0) || (x == 3 && y == 1))
printf("中了五等奖!");
else if(y == 1)
printf("中了六等奖!");
else
printf("遗憾!!!");
return 0;
}