语法基础

Copyright

本页面贡献者:LyuLumos。 本页面内容遵循 MIT 协议,转载请附上原文出处链接和本声明。

理论知识

  • C语言书写格式是自由的,每行可以写多个语句,可以写多行。
  • 一个C语言程序有且只有一个main函数,是程序运行的起点。
  • 每个C语言程序写完后,都是先编译,后链接,最后运行。(.c->.obj->.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。
  • C面向过程,C++、java面向对象。

标识符

  • 合法的要求是由字母、数字、下划线组成,并且第一个必须为字母或是下划线。
  • 关键字不可以作为用户标识符号。main define scanf printf include If 都不是关键字。
  • 驼峰命名法

整数

数据类型 定义标识符 占字节数 数值范围
短整型 short 2 -215~215-1 (32767)
整型 int 4 -231~231-1(约2×109)
超长整型 long long 8 -263~263-1(约9×1018)
无符号整型 unsigned int 4 0~232-1(约4×109)
其余无符号类型同理

实数

数据类型 定义标识符 数值范围 占字节数 有效位数
单精度实型 float -3.4×1038~3.4×1038 4 6~7位
双精度实型 double -1.7×10308~1.7×10308 8 15~16位
布尔型 bool truefalse 1

全整数除法

两个整数相除结果还是整数,5/2的值为2而不是2.5
解决方法:至少一个数转换成浮点数,如5/2.0 (float)a/b
除以0会返回NaN

字符型

定义标识符 占字节数 数值范围
char 1 -128~127
  1. 直接表示 char c = 'A';
  2. ASCII码表示 char ch = 65;
  3. 转义字符 换行符 '\n'
    单引号 '\''
    反斜杠 '\\'
  4. 字符型也可以做加减运算

运算符和表达式

运算符类型 常用运算符 示例
算术运算符 + - * / % ++ -- 5 % 2
关系运算符 > < == >= <= != a == 1
逻辑运算符 && || ! a>0 && a<b
位操作运算符 & | ~ ^ << >> 1<<2
赋值运算符 = += &= <<= a += 2
条件运算符 ? : a == 1 ? 1 : 0
指针运算符 * & *it

赋值语句

  • 格式:   变量 = 表达式;
  • 意义:   将右边表达式的值赋给左边的变量
  • 一定要区分 = 和 等于, C语言中判断相等用 == 运算符
    1
    2
    if(a = 1) //×
    while(a = 1) //×
    
  • 在进行赋值运算时,如果赋值运算符两边的数据类型不同,系统将会自动进行类型转换,即将赋值运算符右边的数据类型转换成左边的变量类型。可能会出现数据丢失。

运算符优先级

自增表达式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int a = 21;
int c ;

// a 的值在赋值之前不会自增
c = a++;   
// c = 21 a = 22

// a 的值在赋值之前自增
c = ++a;  
// c = 23 a = 23

位运算

运算符 名称 作用
& 两个位都为1时,结果才为1
| 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 取反 0变1,1变0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数
  • 区分 |||&&&

标准输入输出

  • 头文件:<stdio.h>
  • 输入函数:
    scanf("%对应格式字符", &变量名);
  • 输出函数:
    printf("其他字符 %对应格式字符 其他字符", 变量名);
  • 一定不要忘记scanf函数中的&
  • 字符类型变量名 = getchar(); 使用时注意吃掉换行符
数据类型 格式符* 数据类型 格式符*
int %d long long %lld
unsigned long long %llu
char %c 字符数组 %s
float %f double %lf

*这里为了看着方便加上了%

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int a;
long long b;
char c;
double d = 1.0;
float f = 2.7;

scanf("%d%lld", &a, &b);
scanf("%c", &c); //空格,回车,缩进都会被读入,注意!
printf("%d%d", a, c); //c被转换成int类型
printf("ans = %f %.12lf\n", f, d);
Bug
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 除了大括号,每行至少有一个bug
int mian()
{
    int a, b; c, d = 1;
    bool flag1 = ture, flag2 = flase;
    scanf("%d", a);
    printf("%d, b");
    c = b + 1
    e = 2ab;
    return 1;
}