学习语言,每次都是从Hello world开始,这次也不例外!
printf:格式化输出
#include <stdio.h>
int main()
{
printf("Hello world");
return 0;
}
Hello world
准备好与BUG对抗了吗?
冲呀!
命名变量的时候要避开关键词命名。
关键词有以下这些:
列举一些转义字符如下:
转义字符 | 含义 |
---|---|
\a | 响铃(BEL) |
\b | 退格(BS),将当前位置移到前一列 |
\f | 换页(FF),将当前位置移到下页开头 |
\n | 换行(LF),将当前位置移到下一行开头 |
\r | 回车(CR),将当前位置移到本行开头 |
\t | 水平制表(HT),移到下一个TAB位置 |
\v | 垂直制表(VT) |
\ | 表示反斜杠本身(\) |
\' | 表示单引号(') |
\" | 表示双引号(") |
\? | 表示问号(?) |
\0 | 表示空字符(NULL) |
\ddd | 1到3位八进制所代表的任意字符 |
\xhh | 1到2位十六进制所代表的任意字符 |
\ 出现在一句的最后,没有加任何东西表示连接下一行内容
#define 标识符 常量
(define的作用可以理解为,把程序中出现的标识符替换为后面的常量)
#include <stdio.h>
# define NAME "远方的星"
int main()
{
printf(NAME);
return 0;
}
(不完全统计,后续会补上)
部分基本类型如下:
数据类型 | 含义 |
---|---|
char | 字符型,占用一个字节 |
int | 整形,通常反应了所用机器中整数的最自然长度 |
float | 单精度浮点型 |
double | 双精度浮点型 |
_Bool | 布尔类型 |
enum | 枚举类型 |
// Time: 2021/7/14 21:13
// Author: 远方的星
// CSDN: https://blog.csdn.net/qq_44921056
#include <stdio.h>
int main()
{
char a;
int b;
float c;
double d;
float f;
a = 'F'; //单引号是字符,双引号是字符串
b = 521;
c = 3.14;
d = 3.1415926;
f = 3;
printf("字符:%c\n", a);
printf("神奇密码:%d\n", b);
printf("圆周率:%.2f\n", c);
printf("圆周率:%11.7f\n", d); //11.7中的7代表精确到小数点后第7位
printf("注意看小数点后的位数:%.2f\n", f);
return 0;
}
字符:F
神奇密码:521
圆周率:3.14
圆周率: 3.1415926
注意看小数点后的位数:3.00
c
和f
都是float
数据类型,但是在编写的时候,c出现了警告(不影响输出结果),但是,我还是查了一下警告的内容。Clang-Tidy: Narrowing conversion from 'double' to 'float'
但是很遗憾,我没有找到相关解释,希望大佬可以解释一下。
用法:
#include <stdio.h>
int main()
{
int i;
char j;
float k;
i = 521;
j = 'H';
k = 3.14;
printf("整型的长度:%d\n", sizeof(int));
printf("i的长度:%d\n", sizeof (i));
printf("字符型的长度:%d\n", sizeof(char ));
printf("j的长度:%d\n", sizeof j);
printf("浮点型的长度:%d\n", sizeof(float ));
printf("k的长度:%d\n", sizeof k);
return 0;
}
在sizeof处的警告(依然不影响输出结果)为:
Format specifies type 'int' but the argument has type 'unsigned long long'
解决方案:
%d
改成%llu
signed是带符号位的
unsigned是不带符号位的
signed int
unsigned int
定义的时候,signed可写可不写,是默认的。
C语言运算符优先级:优先级一览表 简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
表达式
Q:那什么是单目和双目呢?
A:一个符号是双目运算符还是单目运算符,取决于它起作用的有多少个操作数。
如:
类型转换
当运算符左右两个操作数类型不同时,编译器会将它们共同转换位某种数据类型,通常情况下,会向精度较大的那个类型转化。
#include <stdio.h>
int main()
{
printf("i的计算结果:%d\n", 1 + 2); // 假设i=1+2
printf("j的整型计算结果:%d\n", 1 + 2.0);// 假设j=1+2.0
printf("j的浮点型计算结果:%f\n", 1 + 2.0);
return 0;
}
i的计算结果:3
j的整型计算结果:0
j的浮点型计算结果:3.000000
当然,也可以进行强制转换,如,将上面的代码改一下:
#include <stdio.h>
int main()
{
printf("j的整型计算结果:%d\n", 1 + (int)2.0);
return 0;
}
输出结果便是:
j的整型计算结果:3
那如果将2.0改成1.5,那结果是不是按照四舍五入的方法转换成整型的呢?
#include <stdio.h>
int main()
{
printf("j的整型计算结果:%d\n", 1 + (int)1.5);
return 0;
}
运算结果是:
j的整型计算结果:2
结果由3变成了2,由此可见,并不是采取四舍五入的方法,而是直接将小数点后面的数字直接置零处理。
关系表达式
#include <stdio.h>
int main()
{
printf("真--运算结果为:%d\n", 1 < 2);
printf("假--运算结果为:%d\n", 1 > 2);
return 0;
}
逻辑表达式
#include <stdio.h>
int main()
{
//1<2为真,2>1为真,两个进行逻辑与运算,结果应为真
printf("第一个运算结果为:%d\n", 1 < 2 && 2 >1);
//任何非0的数,在这里就被认为是真,3+1=4,4为真,2==0显然是假,进行逻辑或,结果为真
printf("第二个运算结果为:%d\n", 3 + 1 || 2 == 0);
//4为真,进行逻辑非运算,结果为假
printf("第三个运算结果为:%d\n", !4);
// !0结果为真,即1,1+1=2显然小于1,故左边结果为真,!7结果为假,进行逻辑或运算,结果为真。
printf("第四个运算结果为:%d\n", !0 + 1 < 1 || !7);
return 0;
}
第一个运算结果为:1
第二个运算结果为:1
第三个运算结果为:0
第四个运算结果为:0
短路求值
注:C语言对于逻辑与
和逻辑或
采用短路求值的方式。
#include <stdio.h>
int main()
{
int a = 3, b = 3;
(a = 0) && (b = 5);
printf("a=%d, b=%d\n",a,b);
(a = 1) || (b = 5);
printf("a=%d, b=%d\n",a,b);
return 0;
}
a=0, b=3
a=1, b=3
注意:这里b的值一直没变
,而a变成了0和1,原因就是C语言中逻辑与和逻辑或采用的是短路求值。
框架如下:
if(表达式)
{
//这里放逻辑值为真,所执行的语句或程序块
}
根据这个基本的语句,可以进一步的拓展
if(表达式1)
{
//表达式1为真,执行的语句或程序块
}
else if(表达式2)
{
//表达式2为真,执行的语句或程序块
}
else if(表达式3)
{
//表达式3为真,执行的语句或程序块
}
...//此处省略多组else if
else if(表达式n)
{
//表达式n为真,执行的语句或程序块
}
else
{
//以上表达式均为假时,执行的语句或程序块
}
注意:当执行的语句只有一句时,{}可省略。
90分及以上:优 80~89分:良 70~79分:中 60~69分:及格 60分一下:不及格(
需要补考了嗷)
程序如下:
#include <stdio.h>
int main()
{
int i;
printf("请输入你的分数:");
scanf("%d",&i); // 获取键盘输入的值
if (i >= 90)
{
printf("你成绩的等级为优!");
}
else if(i >= 80 && i < 90)
{
printf("你的成绩等级为良!");
}
else if(i >= 70 && i < 80)
{
printf("你的成绩等级为中!");
}
else if(i >= 60 && i < 70)
{
printf("你的成绩等级为及格!");
}
else if(i >= 0 && i < 60)
{
printf("很遗憾,你没有及格,请及时补考!");
}
else
{
printf("你输入的成绩不符合规定哟,请重新输出!!!");
}
return 0;
}
请输入你的分数:95
你成绩的等级为优!
本例输入的成绩为95,等级评定正确,小伙伴也可以自己尝试一下,不同的成绩哟。
scanf函数的用法,可参考:C语言scanf函数用法完全攻略
条件运算符
也是C语言中唯一一个三目运算符
exp1是条件表达式 如果为真,返回exp2 如果为假,返回exp3
条件运算符只适合比较简单的语句。
if (a > b)
max = a;
else
max = b;
上述语句用条件运算符来写,即:
max = a >b ? a :b
框架如下:
switch (表达式)
{
case 常量表达式1: 语句或程序块1
case 常量表达式2: 语句或程序块2
...
case 常量表达式n-1: 语句或程序块n-1
case 常量表达式n: 语句或程序块n
default:语句或程序块n+1 // default为可选项,可以不写
}
当表达式的结果与常量表达式中的结果一致时,则执行想对应的语句或程序块。当没有结果一致时,则执行default中的语句或程序块,如果没有default这部分,则编译器没有任何动作,并不会报错。
A:优 B:良
C:中
D:及格
程序如下:
#include <stdio.h>
int main()
{
char i;
printf("请输入你的分数字母等级:");
scanf("%c",&i);
switch (i)
{
case 'A': printf("你的成绩等级是优!\n");break;
case 'B': printf("你的成绩等级是良!\n");break;
case 'C': printf("你的成绩等级是中!\n");break;
case 'D': printf("你的成绩等级是及格!\n");break;
}
return 0;
}
请输入你的分数字母等级:A
你的成绩等级是优!
本例输入的分数字母等级为A,等级评定正确,小伙伴也可以自己尝试一下,不同的成绩哟。
如果我把break删掉,仍然输入A,让我们来看一下结果:
请输入你的分数字母等级:A
你的成绩等级是优!
你的成绩等级是良!
你的成绩等级是中!
你的成绩等级是及格!
这显然不是我们想要的结果。
也不是很难理解,就是在if语句中嵌套if语句。
直接看例子吧。
(用上面讲的两种也可以实现,但是我们要练习一下嵌套)
程序如下:
#include <stdio.h>
int main()
{
int a, b;
printf("请输入你想比较的两个数(两个数中间用空格分开): ");
scanf("%d %d", &a, &b);
if (a != b)
{
if (a > b)
{
printf("%d > %d\n", a, b);
}
if (a < b)
{
printf("%d < %d\n", a, b);
}
}
else
{
printf("%d = %d\n", a, b);
}
return 0;
}
请输入你想比较的两个数(两个数中间用空格分开):51 15
51 > 15
由此可见,结果正确。分支结构的嵌套是不是也很简单呀~
框架很简单
while(表达式)
循环体
程序如下:
#include <stdio.h>
int main()
{
int i = 1, sum = 0;
while(i <= 100)
{
sum = sum + i;
i = i + 1;
}
printf("计算结果为:%d", sum);
return 0;
}
计算结果为:5050
结果正确!
框架为:
do
循环体
while(表达式)
框架为:
for(表达式1;表达式2;表达式3)
循环体
三个表达式用分号隔开,其中:表达式1是循环初始化表达式 表达式2是循环体检表达式 表达式3是循环调整表达式
值得一提的是,表达式1,表达式2,表达式3可以按照需要进行省略
(但是分号不能省!!!!)如:
for(;表达式2;表达式3)
for(表达式1;;表达式3)
for(表达式1;;)
for(;;)
而for(;;)和
while(1)
{
...
}
的作用是一样的
#include <stdio.h>
int main()
{
int i = 0;
int count;
for (count = 1;count <= 100;count++)//count++的意思就是count = count + 1
{
i = i + count;
}
printf("计算结果为:%d", i);
return 0;
}
计算结果为:5050
结果依然是正确的!
用例子来理解一下:
#include <stdio.h>
int main()
{
int i = 5 , j, k;
j = ++i;
printf("++i的计算结果为:%d\n", j);
i = 5; //对i重新赋值
k = i++;
printf("i++的计算结果为:%d\n", k);
return 0;
}
结果为:
++i的计算结果为:6
i++的计算结果为:5
正好验证了刚刚所说,i ++ 是先赋值后加;++ i 是先加后赋值。
既然有分支结构的嵌套,那循环结构肯定也可以。
程序如下:
#include <stdio.h>
int main()
{
int i , j;
for (i = 1;i <= 9;i++)
{
for (j = 1;j <= i;j++)
{
printf("%d*%d=%d ",i, j, i * j);
}
putchar('\n');//向终端输入一个换行符,用于换行
}
return 0;
}
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
putchar()的功能:是向终端输出一个字符 putchar()语法结构:为 int putchar(int char) 功能是把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中,包含在C标准库,包含在C 标准库 <stdio.h>中。 其输出可以是一个字符,也可以是用char定义好的一个字符型变量。
当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码
。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环
。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
例:
#include <stdio.h>
int main()
{
int i, j;
for (i = 0;i < 4;i++)
{
for (j = 0;j < 4;j++)
{
if (j == 1)
{
break;
}
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
i=0,j=0
i=1,j=0
i=2,j=0
i=3,j=0
#include <stdio.h>
int main()
{
int i, j;
for (i = 0;i < 4;i++)
{
for (j = 0;j < 4;j++)
{
if (j == 1)
{
continue;
}
printf("i=%d,j=%d\n", i, j);
}
}
return 0;
}
i=0,j=0
i=0,j=2
i=0,j=3
i=1,j=0
i=1,j=2
i=1,j=3
i=2,j=0
i=2,j=2
i=2,j=3
i=3,j=0
i=3,j=2
i=3,j=3
这一阶段的笔记就先记录到这里,但学C的道路还很漫长。。。
路漫漫其修远兮,吾将上下而求索。
大家一起加油吧!
作者:远方的星 CSDN:https://blog.csdn.net/qq_44921056
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。