当前位置: 首页 > 知识库问答 >
问题:

在c语言的运算符优先规则中,后置递增和后置递减运算符占什么位置

罗鸿福
2023-03-14

根据这一环节中的信息,后置增量和递减运算符占据首位。这个链接上写着“举个例子:

foo=*P++;

这里,p作为表达式的一个副作用而递增,但是foo的值是*(p++)而不是(*p)++,因为一元运算符是从右到左绑定的“。

但在这样做之后,几乎没有发生任何信息在这些链接中提到。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i = 1;
    int *iptr;
    iptr = &i;
    int num = *iptr++;//1) In this expression the value of 'i' is assigned to num. And an attempt of post incrementing the address stored in *iptr is done as side effect.
    printf("Num value: %d\n",num);

    printf("Pointer: %d\n",*iptr);//2) The address of *iptr is not incremented. If it was then the value of 'i' would not be printed instead it would print the incremented address itself.

    printf("Post increment: %d\n",*iptr++);//3) The address of *iptr will be post incremented (which didn't happen in case of num). But for now the value of 'i' will be printed.

    printf("After increment: %d\n",*iptr);//4) Now the incremented address stored in *iptr will be displayed as there is no value assigned to that address.
    return 0;
}

在上面的实验中,只有在语句结束符之后才能看到post增量的效果。但是,如果对赋值运算符的右操作数执行post增量,则即使在语句结束符之后也看不到任何影响。例如int num=*IPTR++;(如上述实验所述)。那么post递增和递减运算符在运算符优先级规则中到底有什么位置。

共有1个答案

辛意智
2023-03-14

代码的问题在于它具有未定义的行为:当您将指针指向单个局部变量时,取消引用递增指针将产生未定义的行为。

对于进入数组的指针,已很好地定义了取消对递增指针的feefencing。

int array[] = {1, 2, 3};
int *iptr = &array[0];
int num = *iptr++;

此外,使用%d和取消引用运算符打印IPTR是不正确的:在将IPTR强制转换为void*后,需要使用%p打印它,而不取消引用:

printf("Pointer: %p\n", (void*)iptr);
// No asterisk here -----------^

现在一切都按预期工作(演示)。

 类似资料:
  • C++ 重载运算符和重载函数 递增运算符( ++ )和递减运算符( -- )是 C++ 语言中两个重要的一元运算符。 下面的实例演示了如何重载递增运算符( ++ ),包括前缀和后缀两种用法。类似地,您也可以尝试重载递减运算符( -- )。#include <iostream> using namespace std; class Time { private: int hours; // 0 到

  • 问题内容: 从下面或此处的程序中,为什么最后一次调用要打印该值7? 问题答案: 这将打印出“ 6”,因为它将i加1并返回值。5 + 1 = 6;这是前缀,在操作中使用该编号之前会添加该编号。 这将打印出“ 6”,因为它需要i,存储副本,加1并返回副本。因此,你获得了我当时的价值,但同时又增加了它。因此,你可以打印出旧值,但是它会增加。后缀增量的好处。 然后,当你打印出i时,它会显示i的实际值,因为

  • 问题内容: 我注意到,可以将预增减运算符应用于变量(例如)。它可以编译,但实际上并不会改变变量的值! Python中预增/减运算符(++ /-)的行为是什么? 为什么Python会偏离C / C ++中看到的这些运算符的行为? 问题答案: 不是运算符。它是两个运算符。该运营商的身份运营,这什么都不做。(澄清:和一元运算符仅对数字起作用,但是我假设你不会期望假设的运算符对字符串起作用。) 解析为 转

  • 问题内容: 关于Java中的运算符优先级,我有两个类似的问题。 第一: 根据Oracle教程: postfix(expr ,expr–)运算符的优先级高于前缀( expr,-expr) 因此,我假设该评估顺序为: 但是Java似乎忽略了PRE / POST排序,而是将它们放在一个级别上。所以真正的顺序: 是什么导致答案为(10 * 12 * 12)= 1440。 第二个: 这个问题的例子: 可接受

  • 问题内容: jslint工具的提示之一是: ++和- 已知++(递增)和-(递减)运算符会通过鼓励过多的技巧而导致不良代码。在支持病毒和其他安全威胁方面,它们仅次于错误的体系结构。有一个plusplus选项禁止使用这些运算符。 我知道像这样的PHP构造可能很容易导致一次错误的错误,但是我找不到比a 或更好的控制循环的方法。 jslint是否突出显示它们,是因为有些相似的语言缺少“”和“”语法或以不