欲戴王冠,必承其重。如果你总是和别人走一样的路怎么才能保证超越别人,那就得付出不一样的努力。时间就像乳沟,只要你肯挤,就一定会有
#include <stdio.h>int main (){printf ( "hello bit\n" );printf ( "he he\n" );return 0 ;}// 解释://main 函数是程序的入口// 一个工程中 main 函数有且仅有一个
char // 字符数据类型short // 短整型int // 整形long // 长整型long long // 更长的整形float // 单精度浮点数double // 双精度浮点数//C 语言有没有字符串类型?
#include <stdio.h>int main (){printf ( "%d\n" , sizeof ( char ));printf ( "%d\n" , sizeof ( short ));printf ( "%d\n" , sizeof ( int ));printf ( "%d\n" , sizeof ( long ));printf ( "%d\n" , sizeof ( long long ));printf ( "%d\n" , sizeof ( float ));printf ( "%d\n" , sizeof ( double ));printf ( "%d\n" , sizeof ( long double ));return 0 ;}
运行结果:
char ch = 'w' ;int weight = 120 ;int salary = 20000 ;
int age = 150 ;float weight = 45.5f ;char ch = 'w' ;
变量的分类
#include <stdio.h>int global = 2019 ; // 全局变量int main (){int local = 2018 ; // 局部变量// 下面定义的 global 会不会有问题?int global = 2020 ; // 局部变量printf ( "global = %d\n" , global );return 0 ;}
打印结果是什么呢?
运行结果:
为什么??
上面的局部变量 global 变量的定义其实没有什么问题的!当局部变量和全局变量同名的时候,局部变量优先使用
变量的使用
#include <stdio.h>int main (){int num1 = 0 ;int num2 = 0 ;int sum = 0 ;printf ( " 输入两个操作数 :>" );scanf ( "%d %d" , & a , & b );sum = num1 + num2 ;printf ( "sum = %d\n" , sum );return 0 ;}// 这里介绍一下输入,输出语句//scanf//printf
1. 局部变量的作用域是变量所在的局部范围。2. 全局变量的作用域是整个工程。
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。2. 全局变量的生命周期是:整个程序的生命周期。
字面常量(普通的常量)const 修饰的常变量#defifine 定义的标识符常量枚举常量
#include <stdio.h>// 举例enum Sex{MALE ,FEMALE ,SECRET};// 括号中的 MALE,FEMALE,SECRET 是枚举常量int main (){3.14 ; // 字面常量1000 ; // 字面常量const float pai = 3.14f ; //const 修饰的常量pai = 5.14 ; //ok?,编译出错#define MAX 100 //#define 的标识符常量return 0 ;}
这里补充一下枚举常量的用法:
#include <stdio.h>
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
运行结果:
发现枚举常量本身就是一个自然数递增的序列。
枚举常量的定义是以逗号为分隔符,最后一个成员是没有标点符号的。使用时,直接打印成员变量名即可。和后面学的结构体要区别
字符串+转义字符+注释
字符串
"hello bir.\n"
// 下面代码,打印结果是什么?为什么?(突出 '\0' 的重要性)int main (){char arr1 [] = "bit" ;char arr2 [] = { 'b' , 'i' , 't' };char arr3 [] = { 'b' , 'i', 't' , '\0' };printf ( "%s\n" , arr1 );printf ( "%s\n" , arr2 );printf ( "%s\n" , arr3 );return 0 ;}
运行结果:
分析,打印字符串是遇到结束符'\0'才结束,而字符数组arr2长度为3,但是没有结束符,所以为一直打印,知道遇到'\0'才结束。
#include <stdio.h>int main (){printf ( "c:\code\test.c\n" );return 0 ;}
运行结果:
为什么??这里就不得不提一下转义字符了。转义字符顾名思义就是转变意思。
因此在打印字符‘\’时,得写‘\\’,前一个'\'将后面的'\'转义。
因此正确做法:
#include<stdio.h>
int main() {
printf("c:\\code\\test.c\n");
}
运行结果:
#include <stdio.h>int main (){// 问题 1 :在屏幕上打印一个单引号 ' ,怎么做?// 问题 2 :在屏幕上打印一个字符串,字符串的内容是一个双引号 “ ,怎么做?printf("%c\n",'\'');
printf("%c\n",'\"');return 0 ;}
笔试题:
// 程序输出什么?#include <stdio.h>int main (){printf ( "%d\n" , strlen ( "abcdef" ));// \32 被解析成一个转义字符printf ( "%d\n" , strlen ( "c:\test\328\test.c" ));return 0 ;}
为什么?因为'\t'是转义字符,当成一个字符计算,其次是'\328',注意, \ddd是转义字符,当且晋档仅当ddd是八进制数,因此d不可能大于8,也就是说只有'\32'是转义字符,而8不是,因此这里它们是两个字符。
拓展:怎么打印字符'%'?(重点)
但是如果要在格式串里打印%怎么做?
下面这种做法可以吗?
用转义字符??如下:
发现格式中打印%是没有转移字符这种做法的,正确做法如下:
结论:原来打印格式串中打印%要用%来转义。
#include <stdio.h>int Add ( int x , int y ){return x + y ;}/*C 语言风格注释int Sub(int x, int y){return x-y;}*/int main (){//C++ 注释风格//int a = 10;// 调用 Add 函数,完成加法printf ( "%d\n" , Add ( 1 , 2 ));return 0 ;}
C 语言风格的注释 /*xxxxxx*/
C++ 风格的注释 //xxxxxxxx
#include <stdio.h>int main (){int coding = 0 ;printf ( " 你会去敲代码吗?(选择 1 or 0 ) :>" );scanf ( "%d" , & coding );if ( coding == 1 ){prinf ( " 坚持,你会有好 offer\n" );}else{printf ( " 放弃,回家卖红薯 \n" );}return 0 ;}
while 语句 - 讲解for 语句(后期讲)do ... while 语句(后期讲)
#include <stdio.h>int main (){printf ( " 加入比特 \n" );int line = 0 ;while ( line <= 20000 ){line ++ ;printf ( " 我要继续努力敲代码 \n" );}if ( line > 20000 )printf ( " 赢取白富美 \n" );return 0 ;}
#include <stdio.h>int main (){int num1 = 0 ;int num2 = 0 ;int sum = 0 ;printf ( " 输入两个操作数 :>" );scanf ( "%d %d" , & a , & b );sum = num1 + num2 ;printf ( "sum = %d\n" , sum );return 0 ;}
#include <stdio.h>int Add ( int x , int y ){int z = x + y ;return z ;}int main (){int num1 = 0 ;int num2 = 0 ;int sum = 0 ;printf ( " 输入两个操作数 :>" );scanf ( "%d %d" , & num1 , & num2 );sum = Add ( num1 , num2 );printf ( "sum = %d\n" , sum );return 0 ;}
int arr [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; // 定义一个整形数组,最多放 10 个元素
#include <stdio.h>int main (){int i = 0 ;int arr [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };for ( i = 0 ; i < 10 ; i ++ ){printf ( "%d " , arr [ i ]);}printf ( "\n" );return 0 ;}
操作符
简单介绍为主,后面课件重点讲。
+ - * / %
移位操作符
>> <<
位操作符
& ^ |
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
单目操作符
! 逻辑反操作- 负值+ 正值& 取地址sizeof 操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反-- 前置、后置 --++ 前置、后置 ++* 间接访问操作符 ( 解引用操作符 )( 类型 ) 强制类型转换
>>=<<=!= 用于测试 “ 不相等 ”== 用于测试 “ 相等 ”
逻辑操作符
&& 逻辑与|| 逻辑或
条件操作符
exp1 ? exp2 : exp3
逗号表达式(重点,笔试题中很喜欢出)
exp1, exp2, exp3, …expN
下标引用、函数调用和结构成员
[ ] ( ) . ->
常见关键字
auto break case char const continue default do double else enumextern float for goto if int long register return short signedsizeof static struct switch typedef union unsigned void volatile while
注:关键字,先介绍下面几个,后期遇到讲解:
比如:
// 将 unsigned int 重命名为 uint_32, 所以 uint_32 也是一个类型名typedef unsigned int uint_32 ;int main (){// 观察 num1 和 num2, 这两个变量的类型是一样的unsigned int num1 = 0 ;uint_32 num2 = 0 ;return 0 ;}
static 是用来修饰变量和函数的1. 修饰局部变量 - 静态局部变量2. 修饰全局变量 - 静态全局变量3. 修饰函数 - 静态函数
修饰局部变量
// 代码 1#include <stdio.h>void test (){int i = 0 ;i ++ ;printf ( "%d " , i );}int main (){int i = 0 ;for ( i = 0 ; i < 10 ; i ++ ){test ();}return 0 ;}
// 代码 2#include <stdio.h>void test (){//static 修饰局部变量static int i = 0 ;i ++ ;printf ( "%d " , i );}int main (){int i = 0 ;for ( i = 0 ; i < 10 ; i ++ ){test ();}return 0 ;}
运行结果:
对比代码1和代码2的效果理解static修饰局部变量的意义。
结论:
static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束,在子函数中,static修饰的局部变量不管调用多少次,只赋值一次,即第一次调用赋值的结果,也就是说它只赋值一次,其余次的调用都是保存上一次调用的值。
// 代码 1//add.cint g_val = 2018 ;//test.cint main (){
printf ( "%d\n" , g_val );return 0 ;}
这是test.c的内容:
已经报错了,为什么?是没有引用头文件吗?
改成如下:
编译没警告,但是出现不能运行,这是为什么?这种解决方法不是说它是错的,只是它在VS编译器上不行,VS编译器整个环境是一个工程,这种引用头文件是会出错的,正确做法如下:
得用extern关键字声明,既然都说到这里,那就说一下extern的作用参考:
extern关键字_四川精神小伙的博客-CSDN博客
// 代码 2//add.cstatic int g_val = 2018 ;//test.cint main (){printf ( "%d\n" , g_val );return 0 ;}
add.c的内容:
test.c的内容:
不能运行:但是如果顶部添加#include"add.c"头文件,这个代码就能正常运行,这里大家不用太纠结,因为编译器不同。处理方式也不一样。
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。