- 常量在程序期间是不允许改变的
- 常量可以是任何的基本数据类型(整型、浮点型、字符型、枚举型)
- 定义后不能进行修改
- 十进制
- 八进制:0123
- 十六进制:0x123,0X123
- 小数
- 指数
- 单引号中单字符,如 'a'
- 转义字符也是字符常量,如 'n'
- 双引号:" "
- 双引号中可以包含:普通字符 a 或者 abc,转义字符 n, 空格a b
- 字符常量是数组=
-
宏定义
#define 常量名 常量值
-
const关键字定义
const 数据类型 常量名 = 常量值;
-
const 和 #define 的区别
- const 定义常量需要类型,而 define 不需要
- const 在编译、运行的时候起作用,而 define 是在编译的预处理阶段起作用
- const 常量可以调试,但 define 不能进行调试
- const 不能重定义,即不可以定义两个一样的,但 define可以,通过 undef 取消即可重新定义
- define 可以配合 #def,#ifnef,#endif 使用
- define 只是简单的替换
#include
#define a 3 #define b a+1 #define c a/b*3 int main(){ printf("a = %dn", a); printf("b = %dn", b); printf("c = %d", c); // c = 3 / 3 + 1 * 3 = 4 return 0; } 结果: a = 3 b = 4 c = 4
- 正号:+
- 负号:-
- 加号:+
- 减号:-
- 乘号:*
- 除号:/
- 取模(取余):%
- 自增:++
- 自减:–
注:
-
自增自减分为前自增自减 ++a,--a,后自增自减 a++, a--
-
前++:先自增后赋值,前-- 同理
-
后++:先赋值后自增,后-- 同理
-
前增后增只有一个时,都是增 1,如 a=1; a++ -> a=2 或者 ++a -> a=2
#include
int main(){ int a = 10; int b = 10; printf("---前自增---"); printf("先自增:a=%dn", ++a); // 等同于 n = a + 1 printf("自增后的值:a=%dn", a); // 等同于 a = n printf("---后自增---"); printf("先赋值:b=%dn", b++); printf("后自增:b=%dn", b); // 等同于 b = b + 1 return 0; } 结果: ---前自增---先自增:a=11 自增后的值:a=11 ---后自增---先赋值:b=10 后自增:b=11 -
整数除法会舍弃小数部分,如 99/10=9,不论小数部分有多大,直接省略掉
- 等于:==
- 不等于:!=
- 大于:>
- 小于:<
- 大于等于:>=
- 小于等于:<=
注:
- 关系运算符的结果只有真、假两种结果,真的是非零,假的等于 0
- 关系运算符常用在 if 结构语句,或者循环语句中
- 等于是:==,赋值是:=
- 与:&&
- 或:||
- 非:!
注:
- 同关系运算符一样,结果也只有两种,一种为真、一种为假
- 短路现象,这种情况出现在 && 和 || 两种逻辑运算符中
- &&:a && b, 如果 a 为假,后面的就不用进行判断了,因为在与运算中“一假全假”
- ||:a || b ,如果 a 为真,后面的也同样不需要进行判断,因为在或运算中“一真全真”
- = ---> a = 1
- -= ---> a -= 1 ---> a = a - 1
- += ---> a += 1 ---> a = a + 1
- *= ---> a *= 1 ---> a = a * 1
- /= ---> a /= 1 ---> a = a / 1
- %= ---> a %= 1 ---> a = a % 1
- <<= ---> a <<= 1 ---> a = a << 1
- >>= ---> a >>= 1 ---> a = a >> 1
- &= ---> a &= 1 ---> a = a & 1 按位与
- ^= ---> a ^= 1 ---> a = a ^ 1 按位异或
- != ---> a ~= 1 ---> a = a ~ 1 按位取反
赋值运算符的特点:
- 运算顺序从往左
- 赋值运算符左边只能是变量,而右边可以是变量、表达式、常量值
其实上面已经提到了,什么是位运算呢?其实就是二进制的位的逻辑运算,如 3 的二进制是 11,而 4 的二进制为 100,如果现在我们要计算逻辑与,则需要把 3 和 4 的二进制从后往前对应进行与运算即可:
| 第三位 | 第二位 | 第一位 | |
|---|---|---|---|
| 3的二进制 | 0 | 1 | 1 |
| 4的二进制 | 1 | 0 | 0 |
| 与运算:& | 0 | 0 | 0 |
| 或运算:| | 1 | 1 | 1 |
- 按位与:&
- 按位或:|
- 按位取反:~
- 按位异或: ^
这儿容易和逻辑运算符弄混,逻辑运算符如下:
- 与:&&
- 或:||
- 非:!
位运算和逻辑运算的规则其实是一样的,只是一个是针对二进制,一个是针对十进制
三元运算符语法:
条件表达式 ?表达式1:表达式2;
- 如果条件为真,则执行表达式1
- 如果条件为假,则执行表达式2
#includeint main(){ int a = 3, b, c; b = a > 1 ? 12: 21; printf("条件为真时,b = %dn", b); c = a > 4 ? 12: 21; printf("条件为假时,b = %dn", c); return 0; } 结果: 条件为真时,b = 12 条件为假时,b = 21
三元运算符等价于:
if(条件){
表达式1;
} else {
表达式2;
}
运算符优先级:
- 圆括号:( ),下标运算符:[],结构成员运算符:.,分量运算符的指向结构体成员运算符 :->
- 逻辑非:!,逻辑按位取反运算符~、自增自减运算符--,++、负号运算符-、类型转换运算符(类型)、指针运算符和取地址运算符*,&、长度运算符sizeof
- 乘法运算符*、除法运算符/、取余运算符%
- 加法运算符+、减法运算符-
- 左移动运算符<<、右移动运算符>>
- 关系运算符<, >, < , >=
- 等于运算符==、不等于运算符!=
- 按位与运算符 &
- 按位异或运算符^
- 按位或运算符 |
- 逻辑与运算符 &&
- 逻辑或运算符 ||
- 条件运算符 ?:
- 赋值运算符=等
- 逗号运算符 ,
参考: C语言中运算符优先级排序_百度知道 (baidu.com)
标识符的命名规则和规范规则:
- 由26个大小写英文字母、数字0~9、及下划线_ 组成
- 其中数字不能开头,如8a 这样的命名规则是错误的
- 同时也不可以使用关键字命令,如: if 或者 int 之类的词都不能作为标识符
- C语言严格区分大小写,长度无限制
- 标识符不能包空格,如:a b这样的命名就是错误的,这个时候可以使用下划线来替代空格:a_b
规范:
- 不能出现仅靠大小写来区分相似的标识符,如:int a, A
- 所有的宏定义、枚举常数、常量都使用大写字母命令
- 定义变量需要初始化,不然会出现难以预料的结果,这是因为现在使用的变量在以前可能存储过其他数据
- 多个单词组成时,可以使用小驼峰:xxxYyyyZzz,即第一单词首字母小写,其余单词首字母都大写。也可以是使用大驼峰:XxxYyyZzz,所有单词的首字母都大写
C语言本身是没有输入输出语句的,但是可以引入C标准库:#include
scanf("");
输出
printf("");
本人小白一枚,但喜学习,今日做此笔记,供诸君参读,如有错误处,还需君指出。做得有些简陋,如有疑问,可以私聊,我尽力而为。
与君共勉
参考:bilibili尚硅谷



