首页 > 试题广场 >

下面代码段执行的输出结果为 int a=2,*pa=&a;

[单选题]
下面代码段执行的输出结果为

#include <stdio.h>
int main(void) {
    int a = 2, *pa = &a;
    int b = 3, *pb = &b;
    *pa *= *pa * *pb;
    printf("%d\n", a);
}


  • 2
  • 6
  • 12
  • 语法错误
推荐
选C。实际考察的是通过指针操作内容
根据题干分析:
  1. int a=2,*pa=&a; 指针pa指向的是变量a的地址
  2. int b=3,*pb=&b; 指针pb指向的是变量b的地址
  3. 表达式:*pa*=*pa**pb; 根据优先级等价于(*pa)*=(*pa)*(*pb)
  4. 最终结果:*pa为2,*pb为3   经过计算2*3*2赋值给*pa,同时也改变了指针pa指向的地址内容a,所以结果为12
编辑于 2019-10-10 14:38:22 回复(1)
选C

解引用“ * ”的优先级比 乘“*” 高;乘“ * ”的优先级比乘后赋值“ *= ”高。
解引用与乘后赋值的结合性都是从右到左,综上,题干中表达式等价于
*pa *= 2*3;
*pa = (*pa) * 6;
*pa = 12;
编辑于 2019-10-09 18:19:34 回复(0)
答案:C
解答:题目最终输出的为a的值,其中表达式*pa=&a表示pa指向a的地址,任何修改*pa的表达式等价于修改a的值。然后,考虑到c语言中单目运算符的优先级高于双目运算符,因此表达式*pa*=*pa**pb等价于(*pa)*=(*pa)*(*pb),最终*pa=12,因此a的值也为12
发表于 2019-10-09 18:01:14 回复(0)
少看了一个*号,没有看到*=
发表于 2023-07-15 22:31:59 回复(0)
*运算符具有两个含义
1.如果是单目运算符,表示取地址中的值,如题目中*pa,由于pa指向a的地址,所以*pa表示取a地址中的值,即取a的值。
2.如果是双目运算符,表示我们常用到的“乘”。
而这里还考虑到一个知识点,单目运算符的优先级高于双目运算符,所有从右到左依次计算即可。
发表于 2022-04-20 12:03:12 回复(0)
有一个指针的优先级还有一个*在这里即是解引用,也是乘法 a*=b,表示a=a*b
发表于 2021-11-11 07:57:02 回复(0)
本题考察算符优先级
*指针运算符(取指针指向的值)的优先级大于 (*=)的优先级。
然后把表达式加个空格就更加清晰:*pa *= *pa * *pb;
发表于 2021-10-27 14:29:19 回复(0)
*pa*=*pa**pb 等价于 (*pa) = (*pa)*{(*pa)*(*pb)}
*pa=&a: pa指向a的地址,*pa解引用,能修改a的值,最终输出的a是修改后的*pa的值
也即(*pa) = (*pa)*{(*pa)*(*pb)}
                =2*(2*3)
                =12

发表于 2021-07-23 10:13:21 回复(0)