首页 > 试题广场 >

以上代码的实现有错误,下面哪句话的表述是正确的?

[单选题]
函数作用:将整型数组p中n个数据增大
void increment_ints (int p [ ], int n) 
{ 
  assert(p != NULL);  /* 确保p不为空指针 */ 
  assert(n >= 0);  /* 确保n不为负数 */ 
  while (n)  /* 循环n次. */ 
  { 
    *p++;          /* 增大p*/ 
    p++, n--;      /* p指向下一位,n减1 */ 
  } 
}
以上代码的实现有错误,下面哪句话的表述是正确的?
  • *p++应该改为(*p)++
  • 数组的值是一个不能改变的值,所以p不能直接被修改。应该使用一个和p相关联的指针来完成这个操作。
  • while循环的条件必须是一个布尔类型的表达式,表达式应该为n!=0.
  • p不应该定义为变长的数组,参数中不应该包含参数n。
A同级运算符,自右向左,*p++相当于*(p++),正确的应该是(*p)++
编辑于 2015-08-20 11:15:35 回复(15)
我认为四个选项都不严谨
A:*p++ 先解引用当前p指向的位置,再把p加1。前半句错了,后半句对了。具体结果我没有百度也没查文档,是我自己写程序验证的。
B:数组名作为参数传递的时候将作为指针处理,可以通过指针名对值进行修改。
C:while循环的条件可以是表达式,也可以是值。非0为真,0为假
D:参数中传递数组中的长度是无效的,所以要把数组长度单独传送。
发表于 2018-04-05 23:09:22 回复(1)
这道题目应该选C,因为后自增的优先级比解引用的高,前自增的优先级和解引用的一样高
发表于 2015-07-26 22:29:07 回复(10)
后置递增运算符的优先级明明比解引用的优先级高
前置递增运算符才一样
这题是怎么编出来的。。
发表于 2015-08-13 16:47:44 回复(0)
不确定的,难道不应该去运行下代码么?

发表于 2018-01-04 19:33:57 回复(1)
这题我关注的是形参int p[]接受到的p实质上已经不是数组而是隐式转换后的指针p,所以才有p++编译正常;如果直接在main函数中调用p++引发编译错误,因为此时p是数组名
发表于 2016-06-26 21:27:55 回复(2)
这道题没有正确的答案,A选项*p++使得p在解引用前增大这句话明显错误,*p++应该等同于*(p++)等同于 *p;p=p+1;很显然解引用之前p没有变化。
发表于 2015-06-30 17:44:10 回复(1)
B 选项 数组p[]做形参,会退化成指针,所以此时的p是一个指针,数组元素的值是可以通过指针p被修改的
编辑于 2018-05-08 22:21:04 回复(0)
++优先级高于解引用
*p++ 分解后就是   p=p+1 ,*p
不会改变数元素的值
而(*p)++会改变数组元素的值
编辑于 2017-06-26 20:05:20 回复(3)

A,*P++是指 地址先自加,之后取地址值,当然这是后++,例如P[]={1,2,3}

那么 int res = *P++; 此时res = 1; 赋值完成后P指向2

发表于 2015-06-23 21:35:55 回复(0)

后置自增++自减- -运算符 高于 解引用运算符*(c++ primer第5版 p147)

发表于 2018-07-04 22:07:59 回复(0)
这题是有点问题的! 后置递增是先取值 ,再递增的
发表于 2017-04-06 10:05:31 回复(0)
这道题应该选A,这两个运算符优先级相同,结合顺序,自右向左!!!
发表于 2016-08-03 11:04:25 回复(1)
前置和后置的自增运算符都比解引用的优先级高。
        我认为问题出在前置和后置的运算规则上,前置是取值增加值放入寄存器中,所以打印的应该是下一位置的值,后置是取值放入寄存器增加内存中的值,所以打印出的应该是当前位置的值,解引用时应该直接从内存中取值。
发表于 2016-07-20 15:28:32 回复(0)
还是给个链接吧 C++和C以及C#的运算符优先级不一样。可怜我们的大脑啊,编译器设计出来本来是为了让事情变的简单一些的。 
发表于 2015-09-30 21:02:41 回复(2)
这个题其实没答案,*p++属于C中的未定义行为,因编译器而异,虽说现在主流编译器都逐渐趋向于一致
发表于 2015-09-01 20:46:44 回复(0)
*p++使得p在解引用之前增大???
我觉得是先取值,然后再将指针移动到下一位置
发表于 2015-06-15 17:10:10 回复(3)
int a[5]={1,2,3,4,5}; int *p = a; *p++ 加加比解引用优先级高,但是购置加价。加加先和星好结合,在加加。也就是说,先取指针p指向的值(数组第一个元素1),再将指针p自增1; cout << *p++; // 结果为 1 cout <<(*p++); // 1 (*p)++ 先去指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2 cout << (*p)++; // 1 cout <<((*p)++) //2 *++p 先将指针p自增1(此时指向数组第二个元素),* 操作再取出该值 cout << *++p; // 2 cout <<(*++p) //2 ++*p 先取指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2) cout <<++*p; // 2 cout <<(++*p) //2 注意,上面的每条cout输出,要单独输出才能得到后面的结果。
发表于 2015-09-11 03:47:52 回复(1)
*p++和(*p)++的优先级虽然不一样,但是在当前语句中两个表述并不会影响下一个语句的结果,我觉得A答案有问题
发表于 2023-07-27 17:08:53 回复(0)
题意应该是让指针p指向的元素增加n,A选项应该是先取值*p,然后让元素值自增++。而后置++的优先级高于解引用*,所以是错误的,应该是(*p)++
发表于 2023-03-08 15:12:44 回复(0)