#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是输入输出格式说明符,表示按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) 编译器不同答案不同。
无法判断函数调用哪个先执行。