c语言:宏里面参数不加括号容易出错,在使用时尽量加括号及举例

宏里面参数不加括号容易出错,在使用时尽量加括号

程序1:

#include<stdio.h>

#define SQARE(X) X*X

int main()

{

int  n = 10;

int m=SQARE(n);

printf("m=%d\n",m);

return 0;

}

结果:

m=100

请按任意键继续. . .

分析:貌似没有出问题,请看下面两个例子

程序2:

#include<stdio.h>

#define SQARE(X) X*X

int main()

{

int m = SQARE(1 + 3);//1+3*1+3=7

printf("m=%d\n", m);

return 0;

}

结果:

m=7

请按任意键继续. . .

改正程序2:

#include<stdio.h>

#define SQARE(X) (X)*(X)

int main()

{

int m = SQARE(1+3);//1+3*1+3=16

printf("m=%d\n",m);

return 0;

}

结果:

m=16

请按任意键继续. . .

程序3:

#include<stdio.h>

#define ADD(X) X+X  //不加括号容易出错

int main()

{

int m = 10*ADD(2);//10*2+2

printf("m=%d\n",m);

return 0;

}

结果:

m=22

请按任意键继续. . .

改正程序3:

#include<stdio.h>

#define ADD(X) (X+X)

int main()

{

int m = 10*ADD(2);//10*2+2

printf("m=%d\n",m);

return 0;

}

结果:

m=40

请按任意键继续. . .


本文出自 “岩枭” 博客,请务必保留此出处http://yaoyaolx.blog.51cto.com/10732111/1728067

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对的,这个写法是正确的,(*p).name=1和p->name=1是等价的。其中,(*p)是对指针p所指向的结构体的解引用,然后通过点运算符"."来访问结构体中的成员变量name。 如果要修改的话,可以使用括号将*p括起来,如((*p).name)=1。这样做是为了确保"."运算符优先级高于"*"运算符,从而避免出现语法错误。 举例来说,如果有一个结构体类型为Person,其中包含成员变量name和age,可以定义一个指向Person类型的指针p,然后通过(*p).name或p->name来访问name成员变量,如下所示: ``` typedef struct { char name[20]; int age; } Person; Person person = {"Tom", 18}; Person *p = &person; (*p).name = "John"; // 修改name成员变量为"John" p->age = 20; // 修改age成员变量为20 ``` ### 回答2: C语言中(*p).name=1写法是正确的,但是可以更好地使用括号来提高可读性,即(*p).name = 1。 这种写法主要用于操作指针指向的结构体成员。例如,若定义了如下结构体: ```c struct Person { int age; char name[20]; }; ``` 然后声明一个指向该结构体的指针p: ```c struct Person *p; ``` 我们可以通过(*p).name = 1来修改p所指向的结构体中的name成员的值为1。但是可以使用更简洁的箭头运算符->来完成相同的操作,即p->name = 1。 下面是使用箭头运算符修改name成员的示例: ```c #include <stdio.h> struct Person { int age; char name[20]; }; int main() { struct Person obj; struct Person *p = &obj; p->name = 1; // 错误写法 printf("%s\n", p->name); return 0; } ``` 上述示例中,我们尝试将name成员的值修改为1,但是这是错误的,因为name是一个字符数组,无法直接将整数值1赋给它。正确的做法是将其修改为一个字符串,如`p->name = "John"`。 所以,根据结构体成员的类型,我们需要适当修改上述代码,以确保正确赋值。 ### 回答3: C语言中,(*p).name=1写法是正确的。在这个写法中,p是一个指针,(*p)表示解引用指针p得到指向的结构体,然后使用点操作符(.)来访问结构体中的成员name,并将其赋值为1。 在这个写法中,=前面不需要括号。这是因为点操作符(.)的优先级比赋值操作符(=)更高,所以不需要用括号来改变优先级。 举个例子来说明这个写法的使用: ```c #include <stdio.h> struct Person { int age; char name[20]; }; int main() { struct Person person; struct Person* p = &person; (*p).age = 30; (*p).name[0] = 'J'; (*p).name[1] = 'o'; (*p).name[2] = 'h'; (*p).name[3] = 'n'; (*p).name[4] = '\0'; printf("Age: %d\n", (*p).age); printf("Name: %s\n", (*p).name); return 0; } ``` 在这个例子中,我们定义了一个名为Person的结构体,它有一个int类型的age成员和一个char类型的name成员。 我们创建了一个名为person的结构体变量,并将其地址赋值给指针p。 然后,我们使用(*p).name来访问结构体中的name成员,并将其赋值为'J'、'o'、'h'、'n'和'\0'。 最后,我们使用printf函数来打印出结构体中的age和name成员的值。 这个例子展示了(*p).name=1写法的正确使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值