智能车制作
标题:
关于c语言的printf 你怎么看???
[打印本页]
作者:
洗牌
时间:
2013-7-8 14:18
标题:
关于c语言的printf 你怎么看???
二话不说,上代码:
//**************************************************//
//*任务:结构体成员中的数组的赋值,指向结构体的指针*//
//**************************************************//
//**************************************************//
//*新发现:printf:输出时a++不能正常运算,而++a可以*//
//*正常,输出是从右向左进行的。 *//
//**************************************************//
//**************************************************//
//*作者:吴某 日期:2013.7.8*//
//**************************************************//
#include <stdio.h>
#include <string.h>
#define KEY 0
#if (KEY==0)
struct student
{
int num;
int age;
char name[20];
};
void main()
{
struct student stu[2];
struct student* p;
//总结:指针类型变量的声明不能用“,”隔开
struct student* p2;
int a;
a = sizeof(struct student* );
printf("p只占%d个字节,仅表示地址编号!\n",a);
/*以下三种形式等价 一般情况下用p->,形象方便*/
p = &stu;
p->age = 10;
(*p).num = 1001;
strcpy(stu[0].name,"xiao san");
// p2 = &stu[1];
// p2->age = 15;
// p2->num = 1002;
// strcpy(p2->name,"xiao si");
stu[1].age = 15;
stu[1].num = 1002;
strcpy(stu[1].name,"xiao si");
//总结:结构体成员中的数组的赋值方式如上,以下三种皆错
// stu1.name = "xiao san";
// stu1.name[20] = "xiao san";
// stu1.name[20] = {'x','i','a','o',' ','s','a','n'};
printf("name:%s,age:%d,num:%d\n",p->name,p->age,p->num);
printf("一年后,信息变为:\n");
//主要看此处的++p->age,即,++p->age<==>++(p->age),右边同理;
printf("name:%s,age:%d,num:%d\n",p->name,++p->age,p->num);
printf("小三和小四在一个数组里,指向小三的指针加1,信息变为小四的:\n");
//在printf里a++不能实现,或者a+1后数值不能保存住 而++a 可以实现a=a+1
//printf 里面 输出或者运算是从右向左 如下:
printf("name:%s,age:%d,num:%d\n",p->name,p->num,(++p)->age);
a++;
printf("左:%d中:%d右:%d\n",++a,(++a),(++a));
//下 面 不能实现a=a+1运算
// printf("左:%d中:%d右:%d\n",a++,(a++),(a++));
}
#else if(KEY==1)
#endif
作者:
skldjfkjf
时间:
2013-12-6 19:22
不明白你的意思
作者:
若要走
时间:
2013-12-9 21:47
第一,你的第一个总结(指针类型变量的声明不能用“,”隔开)说法片面,可以这样声明:struct student *p, *p2; 。
第二,代码编译错误:错误语句(p = &stu;),错误信息:test.cpp(72) : error C2440: '=' : cannot convert from 'struct student (*)[2]' to 'struct student *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 执行 cl.exe 时出错.
分析:等式左边指针p的类型是struct student*一个结构体指针,等式右边&stu其中stu是结构体数组名,也就是数组struct student stu[2]的首地址,也是数组成员结构体stu[0]的地址,stu的类型也是struct student*;而&为取地址符号,因为stu是结构体数组struct student stu[2]的名字,编译器会将&stu理解为一个成员数是2的以struct student结构体为成员的一维数组的指针。 也就是说等式两边一个是结构体指针,一个是数组指针,类型不一致,不符合语法规则,编译报错。
正确写法可以为p = stu; 或 p = &stu[0];
第三,你对于printf("左:%d中:%d右:%d\n",a++,(a++),(a++));不能实现实现a=a+1运算 有误解,
首先你要明白:++a a自增1后再参与其它运算。
--a a自减1后再参与其它运算。
a++ a参与运算后,a的值再自增1。
a-- a参与运算后,a的值再自减1。
其次你要知道:在printf()函数中,a++,a-- 时,a的值是在printf()函数之后才会被刷新,所以在printf()函
数中,a++,a-- 对a的值暂时不产生影响,而++a、--a会有影响。
请将代码写成:
printf("左:%d 中:%d 右:%d\n", a++, (a++), (a++) );
printf("a = %d\n\r", a );再运行一下看看结果如何,你就知道其中的原理了。
以上分析中我还漏了一点,你自己去思考吧,哥就帮你倒这儿了。
作者:
【征程】
时间:
2013-12-15 21:25
作者:
若要走
时间:
2014-7-27 19:23
作者:
abc342501
时间:
2014-8-29 21:32
作者:
你说好吗
时间:
2014-9-1 20:07
:):)
作者:
Jerry299
时间:
2014-10-2 10:00
都是大神
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2