智能车制作

标题: 关于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