C语言学习笔记

152 阅读3分钟

​「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

例:sizeof

int main()
{
	int a = 10;
	char c = 'r';
	char* p = &c;
	int arr[10] = { 0 };
	//sizeof计算变量所占内存空间的大小,单位是字节
	printf("%d\n", sizeof(a));//4
	printf("%d\n", sizeof(c));//1
	printf("%d\n", sizeof(p));//4
	printf("%d\n", sizeof(arr));//40
	return 0;
}


int main()
{
	short s = 0;
	int a = 10;
	printf("%d\n", sizeof(s = a + 5));//short只能存两个字节
	printf("%d\n", s);//sizeof括号内的表达式不参与运算
    return 0;
}

例 :~

int main()
{
	int a = 0;
	//~按二进制位取反
	//000000000000000000000000
	//111111111111111111111111 -- 补码
	//111111111111111111111110 -- 反码
	//100000000000000000000001 -- 原码
	printf("%d\n", ~a);
	return 0;
}

关系操作符

运算符名称示例功能缩写
<小于aa小于b时返回真;否则返回假LT
<=[小于等于aa小于等于b时返回真;否则返回假LE
大于a>ba大于b时返回真;否则返回假GT
>=[大于等于]a>=ba大于等于b时返回真;否则返回假GE
==等于a==ba等于b时返回真;否则返回假EQ
!=不等于a!=ba不等于b时返回真;否则返回假NE

逻辑操作符

&& 逻辑与:两个表达式必须都为 true(非0),整个表达式才为 true

||    逻辑或:必须有一个或两个表达式为 true,才能使整个表达式为 true。

!  逻辑非:使一个表达式从 true 变成了 false,或者从 false 变成了 true

int main()
{
	int i = 0, a = 0b = 2, c = 3,  d = 4;
	i = a++ && ++b && d++;
	printf("a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d);
	//a=1,b=2,c=3,d=4
	return 0;
}

int main()
{
	int i = 0, a = 1 ,b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf(" a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d);
	//a=2,b=3,c=3,d=5
	return 0;
}

int main()
{
	int i = 0, a = 1 ,b = 2, c = 3, d = 4;
	i = a++ || ++b || d++;
	printf(" a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d);
	//a=2,b=2,c=3,d=4
	return 0;
}

或者关系:左边为真,右边就不用计算

并且关系:左边为假,右边就不用计算了

注:&& (逻辑与) 优先级高于||(逻辑或)

条件操作符

exp1? exp2 :exp3

(若exp1为真,则exp2要计算,否则exp3要计算)

int main()
{
	int a = 0;
	int b = 0;
	if (a > 5)
		b = 3;
	else
		b = -3;


	b = (a > 5 ? 3 : -3);
	return 0;
}

int main()
{
	int a = 10;
	int b = 20;
	int max = 0;
	if (a > b)
		max = a;
	else
		max = b;

	max = (a > b ? a : b);

	return 0;
}

逗号表达式

, 优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。

下标引用,函数调用和结构成员

1.[  ]下标引用操作符

操作数:一个数组名+一个索引值

2.()

调用函数时的()就是函数调用操作符

3.访问一个结构的成员

. 操作符,用来访问结构的成员

struct Stu
{
	char name[20];
	int age;
	char id[20];
};

int main()
{
	int a = 10;
	//使用struct Stu这个类型创建了一个学生对象s1,并初始化
	struct Stu s1 = { "张三",20, "202101029"};
	printf("%s\n", s1.name);
	printf("%d\n", s1.age);
	printf("%s\n", s1.id);
	return 0;
}

 —>

struct Stu
{
	char name[20];
	int age;
	char id[20];
};

int main()
{
	int a = 10;
	//使用struct Stu这个类型创建了一个学生对象s1,并初始化
	struct Stu s1 = { "张三",20, "202101029"};
	struct Stu* ps = &s1;
	printf("%s\n", ps->name);
	printf("%d\n", ps->age);
	//结构体指针—>成员名
	return 0;
}

表达式求值

隐式类型的转换

C的整型算术运算总是至少已缺省整型类型的精度来进行。为了获得这种精度,表达式中的字符和短整型操作数在使用前辈转换为普通整型,这种转换被称为整型提升。整型算术运算要在计算机cpu内的整型运算器中进行。而整型运算器的操作数字节长度是整形int的字节长度。所以在整型计算时,要将所有数据提升至整形int的字节长度32位,即4字节。但即使是两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整形操作数的标准长度。