user-0 提问: typedef struct究竟怎么用？

回复:
user: user-1
content: 引用 17 楼 sholber 的回复:[quote=引用 15 楼 cfjtaishan 的回复:] [quote=引用 14 楼 sholber 的回复:] [quote=引用 7 楼 cfjtaishan 的回复:] 结构体成员怎么没有名字呢？怎么会出现这样的定义？  这有什么奇怪的，如果仅仅是想占个位，可以没有名字。[/quote] 即使是没有问题的定义，但为什么要这样定义呢？为了与众不同，还是其他原因。在实际工作中没有那个工程师这样去定义一个结构体，因为这样定义的数据结构怎么样让读代码的人理解和接收。写好代码的另一个目的就是能让别人看懂，这样定义的数据结构应该会让读者一头雾水吧。[/quote] C标准好多年才修改一回，我相信标准委员会的人不是白痴，会加入一个工程师从来不会使用的特性。看懂看不懂，会不会一头雾水是一回事，C应该怎么样是另一回事。再说，你用不到不等于别人用不到。有些时候就是需要用无名成员来达到严格对齐的目的。[/quote] 首先，不能说标准委员会“白痴”，这是不礼貌的。“严格对齐”这个用途没有考虑到，不过，这个完全也可以被其他方式替代。C语言的规则可能是多样的，兼容性也可以是变得更好，不过，从人性化考虑，从大众化考虑可能写出的代码更具可读性为最佳；当然，也不是绝对的，为了可读性而放弃效率也是不可取的。可读性可以用注释来弥补，为了效率可以牺牲可读性而采用注释去弥补。我提出的是在效率不相上下的情况下，代码的可读性是比较重要的！

user: user-2
content: 引用 15 楼 cfjtaishan 的回复:[quote=引用 14 楼 sholber 的回复:] [quote=引用 7 楼 cfjtaishan 的回复:] 结构体成员怎么没有名字呢？怎么会出现这样的定义？  这有什么奇怪的，如果仅仅是想占个位，可以没有名字。[/quote] 即使是没有问题的定义，但为什么要这样定义呢？为了与众不同，还是其他原因。在实际工作中没有那个工程师这样去定义一个结构体，因为这样定义的数据结构怎么样让读代码的人理解和接收。写好代码的另一个目的就是能让别人看懂，这样定义的数据结构应该会让读者一头雾水吧。[/quote]  C标准好多年才修改一回，我相信标准委员会的人不是白痴，会加入一个工程师从来不会使用的特性。看懂看不懂，会不会一头雾水是一回事，C应该怎么样是另一回事。再说，你用不到不等于别人用不到。有些时候就是需要用无名成员来达到严格对齐的目的。

user: user-1
content: 我感觉凡是让别人、让读者容易产生二义性或者不易理解的代码最好不要写，除了能显摆一下自己“独特”的编程能力，其他的都不是很好的结果：别人看不懂，容易遭骂；同事看不懂，容易找你麻烦；老大看不懂，容易对你“另眼相待”；将来自己看不懂，那就是自欺欺人了。

user: user-1
content: 引用 14 楼 sholber 的回复:[quote=引用 7 楼 cfjtaishan 的回复:] 结构体成员怎么没有名字呢？怎么会出现这样的定义？  这有什么奇怪的，如果仅仅是想占个位，可以没有名字。[/quote] 即使是没有问题的定义，但为什么要这样定义呢？为了与众不同，还是其他原因。在实际工作中没有那个工程师这样去定义一个结构体，因为这样定义的数据结构怎么样让读代码的人理解和接收。写好代码的另一个目的就是能让别人看懂，这样定义的数据结构应该会让读者一头雾水吧。

user: user-2
content: 引用 7 楼 cfjtaishan 的回复:结构体成员怎么没有名字呢？怎么会出现这样的定义？  这有什么奇怪的，如果仅仅是想占个位，可以没有名字。

user: user-2
content: int ;char  哈哈，有趣得紧。

user: user-3
content: 引用 5 楼 user-7 的回复:好好看书吧！！+1,看书

user: user-4
content: 楼主仔细看上面的代码，看看什么诡秘的

user: user-4
content: #include<stdio.h>  int main() { 	struct 	{ 		int a; 		char b; 	}test; 	test.a = 1; 	test.b = 'h';   	printf("%d\n%c\n",test.a,test.b);  	return 0; }

user: user-4
content: int ;char//h这是什么意思

user: user-5
content: 什么意思。。。。

user: user-1
content: 结构体成员怎么没有名字呢？怎么会出现这样的定义？

user: user-6
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-7
content: 好好看书吧！！

user: user-7
content: #include <stdio.h> #include <stdlib.h>  typedef struct person {     int  i;      char str;  } Person;    void rank(Person s) {     s.i = 12;     s.str = 'A';      printf("s.i = %d, s.str = %c\n", s.i, s.str);  }  int main() {     Person s;     rank(s);     return 0; }

user: user-7
content: typedef struct person ｛      int  i;     char  str; ｝Person; void rank(Person s) { }

user: user-5
content: 2楼是我出错的语法，这是为什么啊

user: user-5
content: #include<stdio.h> #include<stdlib.h> #define max 1000 #define temp 1 void disk(P s); typedef struct name { 	char lastname[max]; 	char secondname[max]; 	char firstname[max]; }Name; typedef struct personal { 	int ID; 	Name person; }P; int main(void) { 	P man[temp]; 	for (int i = 0; i < temp; i++) 	{ 		printf("请输入姓："); 		gets(man[i].person.firstname); 		printf("请输入姓与名中间的名字："); 		gets(man[i].person.secondname); 		printf("请输入名："); 		gets(man[i].person.lastname); 	} 	for (int i = 0; i < temp; i++) 	{ 		disk(man[i]); 	} 	system("pause"); 	return 0; } void disk(P s) { 	if (s.person.secondname[0] != '\0') 	{ 		s.person.secondname[1] = '.'; 		for (int i = 0; s.person.firstname[i] != '\0'; i++) 			printf("%c", s.person.firstname[i]); 		printf(" "); 		for (int i = 0; i < 2; i++) 		{ 			printf("%c", s.person.secondname[i]); 		} 		printf(" "); 		for (int i = 0; s.person.lastname[i] != '\0'; i++) 		{ 			printf("%c", s.person.lastname[i]); 		} 		printf("\n"); 	} 	else 	{ 		for (int i = 0; s.person.firstname[i] != '\0'; i++) 			printf("%c", s.person.firstname[i]); 		printf(" "); 		for (int i = 0; s.person.lastname[i] != '\0'; i++) 		{ 			printf("%c", s.person.lastname[i]); 		} 		printf("\n"); 	} }