智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 12947|回复: 7
打印 上一主题 下一主题

关于c语言的printf 你怎么看???

[复制链接]

6

主题

34

帖子

0

精华

高级会员

Rank: 4

积分
600
威望
316
贡献
150
兑换币
193
注册时间
2013-1-15
在线时间
67 小时
跳转到指定楼层
1#
发表于 2013-7-8 14:18:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
二话不说,上代码:
//**************************************************//
//*任务:结构体成员中的数组的赋值,指向结构体的指针*//
//**************************************************//
//**************************************************//
//*新发现: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

8

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1813
威望
1289
贡献
344
兑换币
146
注册时间
2013-9-7
在线时间
90 小时
2#
发表于 2013-12-6 19:22:37 | 只看该作者
不明白你的意思
回复 支持 反对

使用道具 举报

6

主题

1251

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
14709

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章资源大师奖章

QQ
威望
6641
贡献
5456
兑换币
1645
注册时间
2011-2-22
在线时间
1306 小时
3#
发表于 2013-12-9 21:47:56 | 只看该作者
第一,你的第一个总结(指针类型变量的声明不能用“,”隔开)说法片面,可以这样声明: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 );再运行一下看看结果如何,你就知道其中的原理了。

以上分析中我还漏了一点,你自己去思考吧,哥就帮你倒这儿了。


回复 支持 反对

使用道具 举报

16

主题

1096

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7306

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
3288
贡献
2098
兑换币
2140
注册时间
2013-7-18
在线时间
960 小时
4#
发表于 2013-12-15 21:25:06 | 只看该作者
回复 支持 反对

使用道具 举报

6

主题

1251

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
14709

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章资源大师奖章

QQ
威望
6641
贡献
5456
兑换币
1645
注册时间
2011-2-22
在线时间
1306 小时
5#
发表于 2014-7-27 19:23:05 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

173

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1695
QQ
威望
765
贡献
628
兑换币
475
注册时间
2014-7-15
在线时间
151 小时
6#
发表于 2014-8-29 21:32:04 | 只看该作者
回复 支持 反对

使用道具 举报

11

主题

102

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1141
威望
552
贡献
353
兑换币
350
注册时间
2014-8-31
在线时间
118 小时
7#
发表于 2014-9-1 20:07:51 | 只看该作者
:):)
回复 支持 反对

使用道具 举报

0

主题

43

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1085
威望
525
贡献
344
兑换币
355
注册时间
2014-3-7
在线时间
108 小时
8#
发表于 2014-10-2 10:00:45 | 只看该作者
都是大神
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-25 15:21 , Processed in 0.050291 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表