第一周问题总结

0 阅读3分钟

文章用于记录我在学习中遇到的问题

java

先说java中的问题,之前我一直对java输出格式有点不清不楚的,现在做一个总结

java的输出 System.out

1.换行输出:System.out.println()
输出内容后会自动换行

//输出数字
System.out.println(123);
//输出字符串
System.out.println("Hello World!");
//输出变量
int a = 20;
System.out.println("数字a:"+a);
//输出表达式结果
System.out.println(10+30); //输出为30
Hello, Java! 
123 
数字a:20 
40

2.不换行输出:System.out.print()
输出内容后不会换行,后续输出会接在同一行。

System.out.print("Hello"); 
System.out.print(" "); 
System.out.print("Java"); // 这三行输出会在同一行

结果:

Hello Java

3.格式化输出:System.out.printf ()
适合需要按指定格式输出的场景(比如保留小数、对齐等),用法和 C 语言的 printf 类似。

String name = "小明"; 
int age = 18; double score = 98.567;

// 格式化输出:%s=字符串,%d=整数,%.2f=保留2位小数的浮点数 
System.out.printf("姓名:%s,年龄:%d,成绩:%.2f\n", name, age, score);

结果:

姓名:小明,年龄:18,成绩:98.57

补充:%zu:格式化占位符,专门用于匹配 sizeof 运算符的返回值类型(size_t 类型,无符号整数)

java的输入

我一直对nextLine()和next()的区别分不清楚,现在给他搞清楚

方法作用注意事项
nextLine()读取整行字符串(含空格)推荐读取带空格的字符串
next()读取单个字符串(无空格)遇到空格 / 回车就停止读取
Scanner scanner = new Scanner(System.in);
String a = scanner.nextLine();
String b = scanner.next();
//两个都输入 qwerty qwert
System.out.println(a);  //qwerty qwert
System.out.println(b);  //qwerty

C语言的结构体

学数据结构回顾结构体的时候才发现有结构体对齐这个知识点,挺难懂的,现在把我理解的整理一下

1.定义

CPU读取内存时,是按照固定内存大小读取的,如4个字节、8个字节。
但如果数据没有对齐,那就有可能要多次读取才能拿到一个完整数据;如一个指针类型数据占8个字节,第一次取可能只取到前4个,后4个要等到下次,造成效率低下。
编译器会自动在结构体成员之间 / 末尾填充空白字节,让每个成员的起始地址满足对齐要求。

2.对齐规则

  • 成员自身对齐数:成员类型的大小(如 char=1,short=2,int=4,double=8)
  • 结构体整体对齐数:所有成员自身对齐数的最大值(或编译器指定的对齐数,取较小值)

3.实例

结构体大小受变量顺序影响
案例1:未优化顺序的结构体

struct Test1 {
char a; // 1字节,自身对齐数=1 
int b; // 4字节,自身对齐数=4 
short c; // 2字节,自身对齐数=2 
};

int main() {
// 打印结构体大小 
printf("Test1的大小:%zu 字节\n", sizeof(struct Test1)); 
return 0; }

运行结果:Test1的大小:12字节

地址偏移01 2 34 5 6 78 910 11
成员a× × ×bc× ×

总大小:1(a)+3(填充)+4(b)+2(c)+2(填充)= 12。

案例 2:优化顺序的结构体(减少填充)

struct Test2 { 
char a; // 1字节 
short c; // 2字节 
int b; // 4字节 
}; 

int main() { 
printf("Test2的大小:%zu 字节\n", sizeof(struct Test2)); 
return 0; 
}

运行结果:Test2的大小:8 字节

地址偏移012 34 5 6 7
成员a×cb

a和c刚好能一次取到 总大小:0(a)+1(填充)+2(c)+4(b)= 8