C语言入门学习系列:基本语法

引言

#include <stdio.h>

int main(void) {
  int a = 8888;
  printf("Hello World, %d\n", a);
  return 0;
}

这是一个非常简单的入门程序,但也是一个完整的C程序,麻雀虽小五脏俱全,包含了众多C语言基本语法知识:

  • 头文件
  • 主函数
  • 语句
  • 变量
  • 表达式
  • 数据类型
  • 标准库函数

1. 标准库与头文件

简单的说,C程序员在编写C程序时,只要干两件事:

  • ①自己编写函数
  • ②调用别人写的函数

为什么要调用别人写的函数呢?

主要是为了提高效率,如果每个程序都从0到1开始写,很多基础、通用的功能被实现多次,即降低效率,又使代码变得臃肿不便于维护。

C语言提供了大量的函数来完成各种基础、通用的任务,这些函数的集合称为标准库,使用这些函数前需要声明这些函数,即让编译器知道这些函数是存在的,函数声明包含在一类特殊的文件中,称之为头文件

例如, 要使用标准库中的输出函数 printf() ,这个函数的声明在头文件studio.h头中,需要在代码文件最前面指定,指定头文件的语句包含两部分:

  • ①预处理指令#include
  • ②尖括号包围的头文件名

例如,要包含标准输出库的头文件,语法如下:

#include <stdio.h>

2. 语句

在C语言中,语句是构成程序的基本单位,用于执行特定的操作。每个语句以分号;结束。例如,一个简单的赋值语句:

int a = 5; // 将整数5赋值给变量a

语句以逗号为结束标志,一行可以有多个语句,如:

int a = 5; int b = 6; 

实际上,把一条语句写成多行,也是没有问题的:

int 
a 
= 
5
; 

编译器始终会以逗号作为当前语句结束的标志。

逗号可以成为一个单独的语句,称之为空语句,空语句没有任何意义。

3. 表达式

表达式是计算得到一个值的任何合法的C代码片段。它可以是简单的变量引用,如 a,也可以是复杂的数学运算,如 a + b * 3
表达式可以出现在赋值语句中、控制结构中或作为函数参数。

3.1 表达式在赋值语句中

在C语言中,赋值语句通常涉及一个表达式计算结果赋给一个变量。表达式可以是简单的常量、变量,也可以是复杂运算的结果。

#include <stdio.h>

int main() {
    int a = 5, b = 3;
    int sum = a + b; // 这里 "+ b" 是一个表达式
    printf("Sum: %d\n", sum);
    return 0;
}

在这个例子中,a + b就是一个表达式,计算结果为8,然后这个结果被赋值给了变量sum

3.2 表达式在控制结构中

控制结构(如if语句、循环语句)中常常使用表达式来决定程序的控制流程。表达式的真假(非零值视为真,零值视为假)会影响代码的执行路径。

#include <stdio.h>

int main() {
    int age = 18;
    
    if (age >= 18) { // 这里的 "age >= 18" 是一个布尔表达式
        printf("You are an adult.\n");
    } else {
        printf("You are not an adult yet.\n");
    }
    
    return 0;
}

这里的age >= 18是比较表达式,判断年龄是否达到或超过18岁,从而决定了输出哪条消息。

3.3 表达式作为函数参数

函数调用时,传递给函数的可以是直接的值,也可以是表达式的结果。

#include <stdio.h>

void printSum(int x, int y) {
    printf("Sum: %d\n", x + y);
}

int main() {
    int num1 = 10, num2 = 20;
    printSum(num1, num1 + num2); // "num1 + num2" 作为函数参数的表达式
    return 0;
}

printSum(num1, num1 + num2)中,num1 + num2是一个表达式,计算结果30作为第二个参数传递给了printSum函数。

3.4 表达式和语句的区别

表达式是任何可以计算出一个值的代码片段,表达式的核心在于“计算”,它关注于产生一个结果,可能是语句的一个部分。

语句是程序执行的一个基本单位,代表了一个完整的执行动作。

二者的区别:

  • 语句包含表达式,表达式是语句的一部分
  • 表达式一定有返回值,语句不一定有

4. 语句块

语句块是一组由花括号 {} 括起来的语句集合。它们通常用来组织相关的操作,形成逻辑上的单元,比如函数体或者if、for等控制结构的主体。

{
    int x = 1;
    printf("Value of x: %d\n", x);
}

5. 空格

虽然C语言对空格的要求较为宽松,但良好的空格使用习惯能显著提升代码的可读性。例如,在运算符两边添加空格,或在不同逻辑块之间使用空行。

int a = 1;

如上代码中 = 两边的空格不是必须,留空格是为了更好的可读性,如下不留空格也是可以的。

int a=1;

在编写一个函数时,函数块内的代码会缩进,一般是4个空格。

int main() {
	int num1 = 10, num2 = 20;
    printSum(num1, num1 + num2); // "num1 + num2" 作为函数参数的表达式
    return 0;
}

这并非是C语言规范,也是为了更好的可读性,对比下面没有缩进的版本,有缩进会让代码可读性增强,特别是代码量很大的情况下,缩进让函数声明和函数的实现明显的区分开来。

int main() {
int num1 = 10, num2 = 20;
printSum(num1, num1 + num2); // "num1 + num2" 作为函数参数的表达式
return 0;
}

6. 注释

注释是程序员与代码之间的沟通桥梁,帮助理解代码的功能和意图。C语言支持两种注释方式:

  • 单行注释:以 // 开头,直到行尾,整行都是注释,有效代码不能同行
#include <stdio.h>

int main() {
    int a = 5, b = 3;
   
    // 这里 "+ b" 是一个表达式
    int sum = a + b; 
    printf("Sum: %d\n", sum);
    return 0;
}
  • 多行注释:以 /* 开始,以 */ 结束,二者之间的所有内容都是注释,可以包含多行,多行注释可以与有效代码同行,因为其有明确的开始、结束标志
#include <stdio.h>

/*
 主函数
 打印加法计算结果
*/
int main() {
    int a = 5, b = 3;
   
    // 这里 "+ b" 是一个表达式
    int sum = a/* 多行注释可以插在代码中间 */ + b; 
    printf("Sum: %d\n", sum);
    return 0;
}

7. printf() 函数

printf() 是C语言中最常用的输出函数,属于标准输入输出库的一部分。

7.1 基本用法

#include <stdio.h> // 引入标准输入输出库

int main() {
    printf("Hello, World!\n"); // 输出简单的字符串
    return 0;
}

printf()不会换行,如果要求换行,需要在结尾加上换行符\n

实际上,换行符不限于内容结尾,如果在输出内容中间包含换行符,内容就会分成多行输出。

#include <stdio.h> // 引入标准输入输出库

int main() {
    printf("Hello,\n World!\n"); // 输出简单的字符串
    return 0;
}

在这里插入图片描述

7.2 占位符

占位符用于在字符串中指定位置插入变量值。

int age = 25;
printf("I am %d years old.\n", age); // %d 用于整数

C语言的占位符列表:

  • %a:十六进制浮点数,字母输出为小写。
  • %A:十六进制浮点数,字母输出为大写。
  • %c:字符。 %d:十进制整数。
  • %e:使用科学计数法的浮点数,指数部分的e为小写。
  • %E:使用科学计数法的浮点数,指数部分的E为大写。
  • %i:整数,基本等同于%d。
  • %f:小数(包含float类型和double类型)。
  • %g:6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e为小写。
  • %G:等同于%g,唯一的区别是指数部分的E为大写。
  • %hd:十进制 short int 类型。
  • %ho:八进制 short int 类型。
  • %hx:十六进制 short int 类型。
  • %hu:unsigned short int 类型。
  • %ld:十进制 long int类型。
  • %lo:八进制 long int 类型。
  • %lx:十六进制 long int 类型。
  • %lu:unsigned long int类型。
  • %lld:十进制 long long int 类型。
  • %llo:八进制 long long int 类型。
  • %llx:十六进制 long long int 类型。
  • %llu:unsigned long long int 类型。
  • %Le:科学计数法表示的 long double 类型浮点数。
  • %Lf:long double 类型浮点数。
  • %n:已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。
  • %o:八进制整数。
  • %p:指针。 %s:字符串。
  • %u:无符号整数(unsigned int)。
  • %x:十六进制整数。
  • %zd:size_t类型。
  • %%:输出一个百分号。

7.3 输出格式

printf()可以指定占位符的输出格式,比如总宽度,如果宽度不够,就用空格补齐。

  • 宽度 - 可以指定输出字段的最小宽度,如%10d会确保该字段至少有10个字符宽,默认是右对齐,不足则在左边补空格。注意,超过宽度,不会对输出字段进行裁剪,而是按实际大小输出。
    int num = 42;
    printf("数值: %10d\n", num); // 输出:数值:        42
    

在这里插入图片描述

#include <stdio.h>


int main() {
  int num = 56645;
  // 指定宽度是3,比实际宽度5小,不会裁剪
  printf("数值: %3d\n", num);
  return 0;
}

在这里插入图片描述

  • 字符串裁剪 - 指定宽度小于实际宽度,默认不会裁剪,对于字符串可以在宽度前面加点号.实现裁剪。
#include <stdio.h>


int main() {
  printf("%.5s\n", "hello world");
  return 0;
}

在这里插入图片描述

  • 精度 - 对于浮点数,可以指定小数点后的位数,如%.2f表示保留两位小数。这种写法可以与限定宽度占位符,结合使用。
    double num = 3.14159;
    printf("圆周率: %.2f\n", num); // 输出:圆周率: 3.14
    // 精度和宽度结合使用,宽度是6,精度是2,合起来就是%6.2f
    printf("圆周率: %6.2f\n", num); // 输出:圆周率:     3.14
    

在这里插入图片描述

  • 左对齐 - 默认是右对齐,即宽度不够时,左侧不空格。可使用-符号可以使输出内容左对齐,如%-10d
    printf("左对齐: %-10dL\n", num); // 输出:左对齐: 42       
    

在这里插入图片描述

  • 符号 - %+d会输出数字的正负号,% d(注意符号和百分号之间有空格)会在正数前添加空格。
    int pos = 123, neg = -456;
    printf("正数: %+d, 负数: % d\n", pos, neg); // 输出:正数: +123, 负数: -456
    

在这里插入图片描述

  • 十六进制、八进制和二进制输出
    • %x%X - 十六进制输出,不区分大小写。
    • %o - 八进制输出。
    • %b - 注意,C标准库没有直接支持二进制输出的格式说明符,但可以通过其他方法实现,比如循环判断每位的值。
int hexNum = 255;
printf("十六进制: %x, %X\n", hexNum, hexNum); // 输出:十六进制: ff, FF
int octNum = 255;
printf("八进制: %o\n", octNum); // 输出:八进制: 377
  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值