【问题标题】:C pointer sum "not working"C指针总和“不工作”
【发布时间】:2014-02-03 02:41:55
【问题描述】:

我不明白else语句*nombre=(*nombre)++的意义何在。

输出显示"fernando",我认为它会显示"ffsoboep",因为总和。但似乎*nombre=(*nombre)+1 与*nombre=(*nombre)++; 不同

我的问题是为什么会这样?在这种情况下,“++”运算符如何工作。谢谢。

void recursiva (char * nombre)
{

    if (*nombre != '\0')
    {
        recursiva(nombre+1);
        if(*nombre > 'A' && *nombre < 'Z')
        {
             *nombre=*nombre | 32;
        }
        else
        {
             *nombre=(*nombre)++;
             printf("%c \n",*nombre);
        }
    }
}

int main()
{
    char nombre[]="Fernando";
    recursiva(nombre);
    printf("%s",nombre);
}

【问题讨论】:

  • 你为什么写*nombre=(*nombre)++;?写作只是自找痛苦。
  • 听起来你只是想要(*nombre)++
  • @rullof: (*nombre)++ 在我尝试时效果很好。
  • 我也无法理解阿爸自己的歌曲“费尔南多”。
  • 检查序列点。 *nombre=(*nombre)++; 是 UB。

标签: c pointers printf


【解决方案1】:
(*nombre)++

意思不一样

*nombre + 1

意思是“返回*nombre的原始值,副作用是*nombre的值加1”。请注意,*nombre 的确切值何时增加是相当模糊的;虽然它发生在计算 (*nombre)++ 的值之后,但它可能发生在分配给 *nombre 之前、之后或期间,会产生不可预知的结果。

如果你想增加*nombre的值,你不需要将(*nombre)++的值重新赋值给*nombre,实际上尝试这样做的是undefined behavior。作为第一个近似值,程序被允许做任何事情,直到并包括making demons fly out your nose。只需使用++

(*nombre)++;

+= 1:

*nombre += 1;

【讨论】:

  • 是的,我知道,它不是我的代码,它是我拼贴的期末考试...所以,我只是想了解它的作用,在 XCODE IDE 中它可以做任何事情...但在代码块中显示每个字母 + 1。所以......真的不知道该回答什么。
  • 我很确定后缀++ 定义为递增然后返回原始值。这就是为什么我们有前缀++
  • @SebastianC:扩大答案。
  • @sqykly:你会这么认为,但不!没有定义这样的顺序关系。
  • 你说的到底是哪个序列?我是说表达式foo++ 的值被定义为与foo 的值相同(如果它根本没有增加)。对此我十分肯定。如果您正在谈论 bar = foo++ 被实现为 {int temp = foo ; ++foo ; bar = temp}bar = foo; ++foo 的情况,除非您重载 ++foo 是某种硬件寄存器,否则不可能有不同的结果 - “逻辑上不可能与众不同”和“定义”一样好,不是吗?
【解决方案2】:

我运行了你的代码,实际上得到了“ffsoboep”。

如果您在其他编译器中看到“fernando”,我相信标准中没有定义以下几点:

*nombre=(*nombre)++;

这是后期增量。 (x++) 的值是 x 在增量之前的值(即 x == x++ 为真)。 问题是增量何时完成。

如果立即或在 = 表达式的右侧求值之后进行递增,则首先递增值,然后重新分配表达式 (*nombre)++ 的值(即值在递增之前)到已经递增的 *nombre。

如果增量完成,在计算完所有表达式之后,首先将(相同的)值分配给 *nombre,然后才增量。

我认为这没有在标准中定义,因此 - 您可能会看到不同的行为。我过去也遇到过类似的情况。

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多