相关疑难解决方法(0)

printf和++运算符

#include<stdio.h>
main()
{
    int a=10;
    printf("\n %d %d", a, a++); //11 10
    a=10;
    printf("\n %d %d", a++, a); //10 11
    a=10;
    printf("\n %d %d %d ", a, a++,++a); //12 11 12
}
Run Code Online (Sandbox Code Playgroud)

运行之后,我得到了评论中给出的输出.据我所知,第一次输出是预期的,因为printf的执行从右到左但不能理解第二和第三

c

7
推荐指数
2
解决办法
9114
查看次数

序列点与运算符优先级

可能重复:未
测序的值计算(也称为序列点)
未定义的行为和序列点
运算符优先级与评估顺序

我仍然试图围绕以下表达式如何导致未定义的行为:

a = a++;
Run Code Online (Sandbox Code Playgroud)

在搜索SO时,我发现了以下问题:

序列点和运算符优先级之间的差异?0_o

我仔细阅读了所有答案,但我仍然对细节有困难.其中一个答案描述了我的上述代码示例的行为在a修改方面是不明确的.例如,它可以归结为以下任何一种:

a=(a+1);a++;
a++;a=a;
Run Code Online (Sandbox Code Playgroud)

究竟什么使a修改变得模棱两可?这是否与不同平台上的CPU指令有关,以及优化器如何利用未定义的行为?换句话说,由于生成的汇编程序,它似乎未定义?

我没有看到编译器使用的原因a=(a+1);a++;,它只是看起来古怪而且没有多大意义.什么会让编译器使它以这种方式运行?

编辑:

为了清楚起见,我确实理解正在发生的事情,我只是不明白当有关于运算符优先级的规则(它基本上定义了表达式的求值顺序)时它是如何被定义的.在这种情况下,赋值最后发生,因此a++需要首先进行评估,以确定要分配的值a.所以我期望的是a,在修复后增量期间首先修改,但随后产生一个值以分配回a(第二次修改).但运算符优先级的规则似乎使我的行为非常清楚,我没有找到任何"摆动空间",因为它有未定义的行为.

c++ sequence-points

7
推荐指数
1
解决办法
581
查看次数

运行C代码时输出错误

可能重复:
在C中调用函数之前的参数评估顺序

对于下面的代码,我预计输出为20和76,而75和21将作为输出.请解释为什么会这样.

    #include<stdio.h>

    unsigned func(unsigned n)
    {

       unsigned int a =1 ;        
       static unsigned int b=2;        
       a+=b; b+=a;        
       {

         unsigned int a=3;        
         a+=b; b+=a;        
       }
       //printf("%d %d ",a,b);
       return (n+a+b);        
    }
    int main()
    {
        printf("%d %d\n",func(4),func(5));
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

c

7
推荐指数
1
解决办法
349
查看次数

前后对比增量

我获得了前后增量的基础,但是在实际发生在后期增量上时却难以下定决心。

例如,在以下帖子增量代码中:

int counter = 10;
int result = 0;

result = counter++ + 10;

cout << "Counter: " << counter << endl;
cout << "Result: " << result << endl;
Run Code Online (Sandbox Code Playgroud)

我知道Counter的结果将为11,结果为20。由于整个函数都在运行,因此Result的结果将为20。然后,当程序返回0时,它正在加+1;?

+1何时确切添加?

谢谢

c++ c++14

7
推荐指数
1
解决办法
332
查看次数

是(++ i)++未定义的行为?

(++i)++未定义的行为?在检索增量对象以进行后缀增量操作后,是否可能发生前缀增量的副作用?这对我来说似乎很奇怪.

我的直觉是,这在C++ 03中是未定义的,在C++ 11中定义良好.我对吗?

c++ undefined-behavior sequence-points language-lawyer c++11

6
推荐指数
1
解决办法
1615
查看次数

数组[i] = i ++是否被C++标准所涵盖?

我有一个人声称这条线不在C++标准中:

int i(1);
array_of_int[i] = i++;
Run Code Online (Sandbox Code Playgroud)

该人士表示,将指派1,但我们无法知道它是否会在array_of_int[1]array_of_int[2]虽然Visual Studio和大多数编译器都会在array_of_int[1].

他是对的吗?

c++ standards

6
推荐指数
1
解决办法
680
查看次数

C和Java中PreIncrement和PostIncrement运算符的行为

我在Visual C++和Java中运行以下程序:

Visual C++

void main()
{
    int i = 1, j;
    j = i++ + i++ + ++i;
    printf("%d\n",j);
}
Run Code Online (Sandbox Code Playgroud)

输出:

6
Run Code Online (Sandbox Code Playgroud)

Java的:

public class Increment {
    public static void main(String[] args) {
        int i = 1, j;
        j = i++ + i++ + ++i;
        System.out.println(j);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

7
Run Code Online (Sandbox Code Playgroud)

为什么这两种语言的输出不同?语言对于前后增量运算符的处理方式有何不同?

c java pre-increment post-increment

6
推荐指数
1
解决办法
731
查看次数

为什么表达式a == - if语句中为true?

    #include <stdio.h>

    int main()
    {
        int a = 10;
        if (a == a--)
            printf("TRUE 1\t");
        a = 10;

        if (a == --a)
            printf("TRUE 2\t");
    }
Run Code Online (Sandbox Code Playgroud)

为什么第二个if语句是真的?

输出为:TRUE 1 TRUE 2

这是否由于未定义的行为而发生,因为我将相同的变量与其递减的值进行比较?

c pre-increment post-increment

6
推荐指数
1
解决办法
768
查看次数

输出++*p ++

任何人都可以解释我的输出.

#include<stdio.h>
int main() {
    int a[]={10,20,30};
    int *p=a;
    ++*p++;
    printf("%d  %d  %d  %d",*p,a[0],a[1],a[2]);
}
Run Code Online (Sandbox Code Playgroud)

输出是20 11 20 30

后缀增量具有更高的优先级,因此第二个索引的值应该增加.为什么第一个索引的值会增加?

c

6
推荐指数
1
解决办法
282
查看次数

理解逗号运算符

int main()
{
    int a = (1,2,3);
    int b = (++a, ++a, ++a);
    int c= (b++, b++, b++);
    printf("%d %d %d", a,b,c);
}
Run Code Online (Sandbox Code Playgroud)

我是编程初学者.我没有得到这个程序如何显示我的输出6 9 8.

c comma-operator

6
推荐指数
2
解决办法
155
查看次数