变量定义
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。
type variable_list;
在这里,type必须是一个有效的C数据类型,可以是char、w_char、int、float、double或任何用户自定义的对象,variable_list可以由一个或多个标识符名称组成。
变量声明
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
extern int i; //声明,不是定义
int i; //声明,也是定义 建立存储空间
extern 外部的,出现即指外部变量
实例
#include<stdio.h>
// 函数外定义变量 x 和 y
int x;
int y;
int addtwonum()
{
// 函数内部声明变量x和y为外部变量
extern int x;
extern int y;
// 给外部变量(全局变量)x和y赋值
x = 1;
y = 2;
return x+y;
}
int main()
{
int result;
//调用函数 addtwonum
resule = addtwonum();
printf("result 为:%d",result);
return 0;
}
如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上extern关键字的声明即可。
addtwonum.c 文件代码:
#include<stdio.h>
/* 外部变量声明*/
extern int x;
extern int y;
int addtwonum()
{
return x+y;
}
test.c 文件代码:
#include<stdio.h>
/*定义两个全局变量*/
int x = 1;
int y = 2;
int addtwonum();
int main(void):
{
int result;
result = addtwonum();
printf("result 为:%d",result);
return 0;
}
编译执行上述代码
gcc addtwonum.c test.c -o main
./main
result 为:3
整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x或0X表示十六进制,0表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是U和L的组合,U表示无符号整数(unsigned),L表示长整数 (long)。后缀可以是大写也可以是小写
浮点常量
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用e或E引入的。
字符常量
字符串常量
定义常量
#define预处理器
#define identifier value
实例:
#include<stdio.h>
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
int main()
{
int area;
area = LENGTH * WIDTH;
printf("value of area : %d",area);
printf("%c",Newline);
return 0;
}
const 关键字
可以使用const前缀声明指定类型的变量,如下:
const type variable = value;
实例:
#include<stdio.h>
int main()
{
const int LENGTH 10;
const int WIDTH 5;
const int NEWLINE '\n';
int area;
area = LENGTH * WIDTH;
printf("value of area : %d",area);
prtintf("%c",NEWLINE);
return 0;
auto存储类
auto存储类是所有局部变量默认的存储类。
{
int mount;
auto int month;
}
上面的实例定义了两个带有相同存储类的变量,auto只能用在函数内,即auto只能修饰局部变量。
register存储类
register存储类用于定义存储在寄存器中而不是RAM中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的’&'运算符(因为它没有内存位置)。
{
register int miles;
}
寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义’register’并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
static存储类
static 存储类指示编码器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用static修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当static修饰全局变量时,会使变量的作用域限制在声明它的文件内。
全局声明的一个static变量或方法可以被任何函数或方法调用,只要这些方法出现在跟static变量或方法同一个文件中。
实例:
#include<stdio.h>
/*函数声明*/
void func1(void);
static int count = 10; /*全局变量 -static 是默认的 */
int main()
{
while (count--) {
func1();
}
return 0;
}
void func1(void)
{
/* 'thingy'是'func1'的局部变量 -只初始化一次
* 每次调用函数'func1''thingy'值不会被重置。
*/
static int thingy=5;
thingy++;
printf("thingy 为 %d, count 为 %d\n",thingy,count);
}
实例中count作为全局变量可以在函数内使用,thingy使用static修饰后,不会在每次调用时重置。
extern存储类
extern存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当使用extern时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
extern是用来在另一个文件中声明一个全局变量或函数。extern修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候
第一个文件:main.c
#include <stdio.h>
int count ;
extern void write_extern();
int main()
{
count = 5;
write_extern();
}
第二个文件:support.c
#include<stdioo.h>
extern int count ;
void write_extern()
{
printf("count is %d\n",count);
}
第二个文件中的extern关键字用于声明已经在第一个文件main.c中定义的count。
算数运算符
+(加)、-(减)、*(乘)、/(除)、%(取模取余)、++(自增,增加1)、–(自减)
a++
为先赋值后运算 ++a
为先运算后赋值
关系运算符
==、!=、<、>、>=、<=
逻辑运算符
&&:称为逻辑与运算符。如果两个操作数都非零,则条件为真
||:逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真
!:逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假
位运算符
假设变量A的值为60(00111100),变量B的值为13(00001101),则:
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与操作,按二进制位进行"与"运算。运算规则:0&0=0;0&1=0;1&0=0;1&1=1 | (A&B)将得到12,即00001100 |
l | 按位或运算符,按二进制位进行"或"运算。运算规则:`0 | 0=0;0 |
^ | 异或运算符,按二进制位进行"异或"运算。运算规则:0^0=0;0 ^1=1;1 ^0=1;1 ^1=0 | (A^B)将得到49,即00110001 |
~ | 取反运算符 | (~A)将得到-61,即为11000011,一个有符号二进制数的补码形式 |
<< | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0) | A<<2将得到240,即11110000 |
>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃 | A>>2将得到15,即00001111 |
赋值运算符
=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
杂项运算符
运算符 | 描述 | 实例 |
---|---|---|
sizeof() | 返回变量的大小 | sizeof(a)将返回4,其中a是整数 |
& | 返回变量的地址 | &a;将给出变量的实际地址 |
* | 指向一个变量 | *a;将指向一个变量 |
?: | 条件表达式 | 如果条件为真?则值位X:否则值为Y |
C中的运算符优先级
后缀:() [] -> . ++ --
从左到右
一元:+ - ! ~ ++ -- (type)* & sizeof
从右到左
乘除:* / %
从左到右
加减:+ -
从左到右
移位:<< >>
从左到右
关系:< <= > >=
从左到右
赋值:= += -= *= /= %= >>= <<= &= ^= |=
从右到左
C语言把任何非零和非空的值假定为true,把零或null假定为false
if语句 if…else语句 嵌套if语句
switch语句 嵌套switch语句
?:运算符(三元运算符)
输入一个数字来判断它是否为奇数或偶数实例
#include<stdio.h>
int main()
{
int num;
printf("请输入一个数字:");
scanf("%d",&num);
(num%2==0)?printf("偶数"):printf("基数");
}
return 0;
循环类型
while循环
while(condition)
{
statement(s);
}
for循环
for ( init; condition; increment )
{
statement(s);
}
do…while循环
do
{
statement(s);
} while (condition);
条件表达式出现在循环的尾部,所以循环中的statement(s)会在条件被测试之前至少执行一次
嵌套循环
循环控制语句
break语句
当break语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句
它可用于终止switch语句中的一个case,如果时嵌套循环,break语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码
continue 语句
告诉一个循环体立即停止本次循环迭代,重新开始下一次循环迭代
goto语句
将控制转移到被标记的语句。但是不建议在程序中使用
*无限循环
如果条件用于不为假,则循环将变成无限循环。for循环在传统上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,可以将某些条件表达式留空来构成一个无限循环
#include<stdio.h>
int main()
{
for( ; ; )
{
printf("该循环会永远执行下去!\n");
}
return 0;
}
可以按 ctrl+c 键终止一个无限循环