关于C语言的一些笔记
文章目录
- May4,2023
- 常量问题
- 基本数据类型
- 补码
- printf的字符格式控制
- 关于异或、异或的理解
- 赋值运算
- ++i和i++的区别
- 关系运算符
- May5,2023
- 逻辑运算中‘非’的理解
- 逗号运算
- 运算符的优先级问题
- 三目运算
摘自加工于C技能树
May4,2023
常量问题
//定义常量
const float PI;
PI = 3.14;
//false ,这种声明变量是错误的,常量声明之后就不能修改,即不能再赋值,所以应该声明之处就赋值。
//正确的方法为下面两种
const float PI = 3.14;
#define PI 3.14
printf("半径为%.2f的圆,面积是%.2f", radius, area);
//%.2f,表示精确,保留小数后2位数。
//关于科学记数法
314e-2:这个e和后面的-2是一个整体,e可以理解为*10^,与-2连起来就是*10^-2。所以314e-2就是314*10^-2=3.14。
基本数据类型
signed:代表有符号的,第一个位代表正负,剩余的代表大小,例如:signed int 大小区间为-128-127。(默认为signed)
unsigned:代表无符号的,所有的位都为大小,没有负数,例如:unsigned int 大小区间为:0-255。
补码
正数的补码是该数的二进制形式。
负数的补码需要通过以下几步获得:
(1)先取得该数的绝对值的二进制形式
(2)再将第1步的值按位取反(除符号位)
(3)最后将第2步的值加1
printf的字符格式控制
printf函数的格式控制 说明符:
%d:有符号十进制整数
%u:无符号十进制整数
%i:与%d相同
%o:无符号八进制整数(不输出前缀0)
%x:无符号十六进制整数(不输出前缀0)
%c:输出一个字符
%s:输出一个字符串
%f:浮点数,十进制小数形式,默认保留6位小数
%e:浮点数,e指数形式,小数点前有且仅有一位非零数,指数部分一般占4位
%g:根据值,自动选择%f或%e,不输出无意义的0
%p:输出指针(地址)
%%:输出一个 %
('a' <= ch <= 'z')‖('A’<=ch<='Z') (ch >= 'a' && ch <= 'z')‖(ch >= 'A' && ch<='Z')//前面表达是数学式的表达,因为C语言中没有 连等于 这样的表达,所以要用后面这种符合C语言表达的。
scanf("%c",&ch)什么意思?
scanf()读变量的时候需要其实际存储的地址。%c是字符型,把输入的数字按照ASCII码相应转换为对应的字符。字符型取地址要加&。字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,就不加&
关于异或、异或的理解
异或:男性和女性能生出孩子,否则就不行。
同或:同性之间才是真爱
来源于知友
赋值运算
int a=b=c=10
连续赋值应保证等号左边为变量,右边为赋值,并且变量已经有了存储空间;
此时bc相当于没有定义就使用了,会报错;应先定义,赋予存储空间,改为
int a,b,c;
a=b=c=10
int main(int argc, char** argv),char** argv这句啥意思???
argc是传入main的参数个数,argv是传入main的函数列表,char**二级指针去指向它
++i和i++的区别
关系运算符
注意:C语言的基本数据类型有char、int、double,我们暂时认为只有char和int适用于上述关系运算符,double和字符串(字符数组)的关系运算以后再讨论。
注意:C语言没有“之间”、“中间”、“之内”或“在某范围内”的关系运算符,例如年龄在25-30岁之间,只能表达为:年龄大于等于25岁
并且 年龄小于等于30岁。
May5,2023
逻辑运算中‘非’的理解
year % 100 != 0 和 !(year % 100 == 0)两者的区别是什么?
逗号运算
引言,这是我最兴奋的一章,看了大佬文章,就像是哥伦布发现新大陆那样,感觉很新奇。但我这里只写我感觉到的,并远没有大佬那种深层次看问题的角度,也得不出来那样的结论,但他们就是我的师傅,我的目标,是我想要成为的那种人。
``Q:请教一下,这个y=(x=a+b),(b+c);语法是那个版本的支持的语法,我用得编译器始终报错,我想了了一下这个语句本质上归咎为y=7,9了,但这不符合我目前对C语言的认知,想着是不是这种定义出错了呢?
A:来自于大佬黛琳ghz的解答这种语法形式是 C 语言中的逗号表达式,用于在一个语句中包含多个表达式。在该语法中,逗号左边的表达式会被执行,但其结果会被忽略,然后逗号右边的表达式会被求值并赋值给 y。
C 语言中,逗号表达式的优先级是最低的,也就是说,它是所有运算符中优先级最低的。因此,在使用逗号表达式时要格外注意其优先级问题。
语句 y=(x=a+b),(b+c); 实际上是将 (x=a+b) 的结果赋值给 y,然后对 (b+c) 进行求值,但该结果却被忽略了。所以,实际上该语句的效果等同于 y = (x = a + b);。
关于编译器报错的问题,由于不同的编译器可能存在语法实现细节的差异,建议检查一下使用的编译器是否支持该语法。
测试前:
#include <stdio.h>
int main(int argc, char **argv)
{
int a=3, b=4, c=5;
int x=0;
int y=(x=(a+b)),(b+c);
printf("第一个y=%d\n", y);
y=((x=a+b),(b+c));
printf("第二个y=%d\n", y);
}
//运行结果
/*
.code.tio.c:6:23: error: expected ')'
int y=(x=(a+b)),(b+c);
^
.code.tio.c:6:21: note: to match this '('
int y=(x=(a+b)),(b+c);
^
.code.tio.c:6:22: error: redefinition of 'b'
int y=(x=(a+b)),(b+c);
^
.code.tio.c:4:11: note: previous definition is here
int a=3, b=4, c=5;
^
2 errors generated.
/srv/wrappers/c-clang: line 5: ./.bin.tio: No such file or directory
*/
对于以上错误查询未果,于是阴差阳错下,把y提前声明了一下就好。
#include <stdio.h>
int main(int argc, char **argv)
{
int a=3, b=4, c=5,x=0,y;
y=(x=(a+b)),(b+c);
printf("第一个y=%d\n", y);
y=((x=a+b),(b+c));
printf("第二个y=%d\n", y);
}
//运行结果
/*
第一个y=7
第二个y=9
.code.tio.c:5:19: warning: expression result unused [-Wunused-value]
y=(x=(a+b)),(b+c);
~^~
1 warning generated.
*/
总结:
#include <stdio.h>
int main(int argc, char **argv) {
int a=1,b=2,c=3,d=4;
int x,y;
x = a,b,c,d;//不带括号的 ,数据类型 变量名 = 表达式1,表达式2,表达式3,表达式4;
y = (a,b,c,d);//带括号的 ,数据类型 变量名 = (表达式1,表达式2,表达式3,表达式4);
printf("x:%d\n",x);
printf("y:%d\n",y);
}
//运行结果:
1
4
/*
注解:逗号运算符有两种方式。
第一种是不添加括号的,这种只会执行第一个表达式1,而忽略其他表达式的结果,并且返回第一个表达式的值或者说计算机可能把所有的表达式都执行了,但是呈现给你的是第一个表达式的值;
第二种是带括号的,这种执行了前面的表达式(即表达式1,表达式2,表达式3),但是忽略了他们的结果,只返回最后一个表达式(即表达式4)的值。
*/
运算符的优先级问题
三目运算
比较三个数中的大小
B选项有点看不懂。