C语言操作符(2)

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	short s = 0;
	int a = 10;
	printf("%d\n", sizeof(s = a + 5));
	printf("%d\n", s);

	return 0;
}

sizeof()括号内部是不参与运算的,所以s还是0,它的类型是short,所以占2个字节。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a = 0;
	printf("%d\n", ~a);

	return 0;
}

a的原码:00000000000000000000000000000000

正数原反补相同,

a的补码:00000000000000000000000000000000

~a的补码为:11111111111111111111111111111111

反码-1:11111111111111111111111111111110

原码再取反:10000000000000000000000000000001(-1)

打印出来的是原码,内存中的是补码。

#include <stdio.h>

int main()
{
	int a = 11;
	//000000000000000001011
	a = a | (1 << 2);
	printf("a = %d\n", a);
	return 0;
}

 现在我又想让它变回去,怎么做呢~

#include <stdio.h>

int main()
{
	int a = 11;
	//000000000000000001011
	a = a | (1 << 2);
	printf("a = %d\n", a);
	a = a & (~(1 << 2));
	printf("a = %d\n", a);

	return 0;
}

#include <stdio.h>
int main()
{
	int a = (int)3.14;
    return 0;
}

强制类型转换:(数据类型)

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 1;
	int c = a && b;
	printf("%d\n", c);
    return 0;
}

&&逻辑与,||逻辑或,结果只有0和1。仅仅是两数之间,不是按位的 |,&,^。

a++先用后自加,而又因为是&&,所以后面直接不用计算,这就是所谓的断路特性,提高效率。

注:别忘了a后面要自加,所以是1 2 3 4

关于三目运算符,目为操作数的数目。

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 1;
	int max = 0;
	max = (a > b ? a : b);
	printf("max = %d\n", max);
    return 0;
}

 

关于结构体struct的格式,参考:定义一个结构体最后为什么要再加一个分号_百度知道

关于do

{

}while();一样。

for()和while()下面有语句就不用加;

如果没有语句就要加上;空语句。目的是为了防止把下面的当成它的语句。加上;表示结束。 

而结构体是定义, 所以要加。

#include <stdio.h>

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

int main()
{
	struct Stu s1 = {"张三", 18, "2018012336"};
    return 0;
}

 创造了一个结构体类型-struct Stu

struct Stu s1:使用struct Stu 这个类型创建了一个学生对象s1,并初始化。

 有一个点比较容易混淆,就是一维数组的定义和字符串的定义

一维数组中可以这样定义:char 数组名[] = {};

而字符串则是:char 变量名[] = " ";//有‘\0’

如果是char name[] = "张三";

中间的中文占两个字节,\0占一个字节,所以sizeof(name) = 2 * 2 + 1 = 5;

#include <stdio.h>

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

int main()
{
	struct Stu s1 = {"张三", 18, "2018012336"};
	printf("%s\n", s1.name);
	printf("%d\n", s1.age);
	printf("%s\n", s1.id);

    return 0;
}

用s1.name来读取数据。

语法:结构体变量.成员名

 struct Stu* p = &s1;
 printf("%s\n", (*p).name);

定义一个结构体指针,用解引用操作来打印。

 printf("%s\n", p->name);

 还可以用->这种写法,指针->指向的对象来打印。

语法:结构体指针->成员名

 

 

 参考:C语言学习--代码分析整形提升过程_庸人冲的博客-CSDN博客

 整型提升

1)各种整型类型的运算首先要是int类型,再进行计算。

2)如果接收运算结果的变量为short或者char则会发生数据截断。

为什么要整型提升?

         因为表达式的整型运算是在cpu中的运算器内执行,也就是ALU,而ALU的操作数长度与int的长度一样。

#include <stdio.h>

int main()
{
	char a = 3;
	char b = 127;
	char c = a + b;
	printf("%d\n", c);
	return 0;
}

 

 

 

 a 和 b 都发生整型提升补了一堆1,所以打印c.

 转自:c语言中的 %u 什么意思啊?_百度知道

c语言中的%u是输入输出格式说明符,表示按unsigned int格式输入或输出数据。

%d 有符号10进制整数 

%i 有符号10进制整数 

%o 无符号8进制整数 

%u 无符号10进制整数 

%x 无符号的16进制数字,并以小写abcdef表示

%X 无符号的16进制数字,并以大写ABCDEF表示

%F/f 浮点数 

%E/e 用科学表示格式的浮点数 

%g 使用%f和%e表示中的总的位数表示最短的来表示浮点数 G 同g格式,但表示为指数 

%c 单个字符 

%s 字符串

 

 

 问题表达式:

1)a * b + c * d + e * f;

在不同编译器下有不同的算法路径,所以要避免这种写法。

2)

3) 编译器不同答案不同。

 

 

无法判断函数调用哪个先执行。

 

 所以我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那么这个表达式就存在问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值