#include <stdio.h>

int main() {
    char u[] = "UVWXYZ";
    char v[] = "xyz";
    struct T {
        int x;
        char c;
        char *t;
    } a[] = {{11, 'A', u}, {100, 'B', v}}, *p = a;

    p = a;
    printf("*(++p)->t = %c\n", *(++p)->t);
    p = a;
    printf("*++p->t = %c\n", *++p->t);
    p = a;
    printf("++*p->t = %c\n", ++*p->t);
}

结果是:

*(++p)->t = x
*++p->t = V
++*p->t = W 

我认为*(++p)*++p是一样的,因为指针会先递增.但是为什么*(++p)->t*++p->t有不同的结果呢? 还有,我认为++*p意味着指针指向u[0],也就是'U',那么'U'就会递增.所以我认为结果应该是'V'

推荐答案

  1. *(++p)->t被判断为*((++p)->t),因为间接运算符*具有小于->precedence.递增p,现在指向a[1],并返回修正后的*t,即v[0].

    随后,您将在下一行中重置p = a.

  2. *++p->t被判断为*(++(p->t)),因为前缀运算符++具有低于->的优先级,并且尽管前缀运算符++和间接*具有相同的优先级,但它们是从右向左关联的.效果是提前设置a[0].u = &u[1],然后打印值u[1].

  3. ++*p->t的计算结果为++(*(p->t)),其结果是递增存储在u[1]的值,因此现在它是下一个字母'W'.

更希望单元测试是独立的.字符串测试数据的 Select 不是很好,因为您不能从%c来判断指针是前移还是值*(u+1) == (*u) + 1递增.

C++相关问答推荐

为什么静态说明符为内联函数生成外部定义?

为什么下面的递归基本情况在C中不起作用?

找出文件是否包含给定的文件签名

如何在C宏中确定 struct 中元素的类型?

在c++中使用堆栈的有效括号

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

在C++中父进程和子进程中的TAILQ队列同步问题

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

可变宏不能编译

在函数外部使用内联ASM时无法指定操作数

安全倒计时循环

我可以创建适用于不同endian的 colored颜色 struct 吗?

带有数组指针的 struct 在print_stack()函数中打印随机数

为什么会出现此错误?二进制表达式的操作数无效

赋值两侧的后置增量,字符指针

Linux memcpy 限制关键字语法

C 中类型说明符的顺序重要吗?

Codewars Kata 掷骰子的不稳定行为