(已解决)C编程宏定义函数
本帖最后由 与龙共舞 于 2018-7-3 18:04 编辑抽象一个问题,我选择一个变量出来,然后使用。
1 #include<stdio.h>
2 int A,B,C;
3 #define Pick(a) (a)?(A):(B)
4 void main()
5 {
6 printf("%d\t%d\t%d\n",A,B,C);
7 C=Pick(1);
8 printf("%d\t%d\t%d\n",A,B,C);
9 }
~ 如此是可以的 Pick(1)就是把A选出来,赋值给C。 Pick(0)就是把B选出来,赋值给C。
实际问题并不是这样的,应该是:
1 #include<stdio.h>
2 int A,B,C;
3 #define Pick(a) (a)?(A):(B)
4 void main()
5 {
6 printf("%d\t%d\t%d\n",A,B,C);
7 Pick(1)=C;
8 printf("%d\t%d\t%d\n",A,B,C);
9 }
~ 就是第七句话不同 ,其实我是想PICK一个出来,对其赋值。
那么问题来了,这样是编译失败的,=左值是常量不可以赋值,失败。
类似的写出函数也是失败的
1 #include<stdio.h>
2 int A,B,C;
3 int Pick(int a)
4 {
5 int tem=a?A:B;
6 returntem;}
7 }
8
9void main()
10 {
11 printf("%d\t%d\t%d\n",A,B,C);
12 Pick(1)=C;----FAIL!!!!!!
13 printf("%d\t%d\t%d\n",A,B,C);
14 }
函数不能作为左值!只能如下2 int A,B,C;
3 void Pick(int a,int *b)
4 {
5 *b = a ? A : B;
7 }
8
9 void main()
10 {
11 printf("%d\t%d\t%d\n",A,B,C);
12 Pick(1, &C);
13 printf("%d\t%d\t%d\n",A,B,C);
14 }
那么该如何修改呢?
不希望写成函数形式的,写成宏定义形式的比较好。
int A, B;
#define PICK(c) *((c)?(&A):(&B))
int a,b;
#define pick_1a
#define pick_2b
#define pick(x) pick_##x 楼主,我们探讨一下。我一般使用的时候前面是表达式(a==1)?A:B;从理论上来分析,a==1这里是一个表达式,这样改一下是否可以? 绝对地址赋值,如何? 这样改一下:#define Pick(a,A,B) (a)?(A):(B)
本帖最后由 xiajintaord 于 2018-6-28 11:26 编辑
所以,楼主希望 条件运算符给你返回一个变量?或者说是一块地址,让你去赋值? 本帖最后由 与龙共舞 于 2018-6-28 13:42 编辑
Mandelbrot_Set 发表于 2018-6-28 11:47
跪谢搞C这么久 还不知道这个知识 太犀利了
1 #include<stdio.h>
2 int A,B,C;
3 #define Pick_0 A
4 #define Pick_1 B
5 //#define Pick(a) (a)?Pick_1:Pick_0 ------这是不行的!
6 #define Pick(a) Pick_##a------------------成功!
7 void main()
8 {
9 printf("%d\t%d\t%d\n",A,B,C);
10 Pick(1)=1;
11
12 printf("%d\t%d\t%d\n",A,B,C);
13 }
14
我真的是第一次看到这个做法转义 的 #define Pick(a) Pick_##a可以
#define Pick(a) Pick_(a)不行
yu0405jie 发表于 2018-6-28 15:59
这个答案符合楼主的意思,赞同:victory: yu0405jie 发表于 2018-6-28 15:59
可以的你这是正经方法
1 #include<stdio.h>
2 int A,B,C;
3 //#define Pick(a) * ( (a)?(&A):(&B))-----OK
4 #define Pick(a) (a)?(A):(B)--------------FAIL
5 void main()
6 {
7 printf("%d\t%d\t%d\n",A,B,C);
8 Pick(1)=1;
9
10 printf("%d\t%d\t%d\n",A,B,C);
11 }
12
页:
[1]