#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的执行从右到左但不能理解第二和第三
可能重复:未
测序的值计算(也称为序列点)
未定义的行为和序列点
运算符优先级与评估顺序
我仍然试图围绕以下表达式如何导致未定义的行为:
a = a++;
Run Code Online (Sandbox Code Playgroud)
在搜索SO时,我发现了以下问题:
我仔细阅读了所有答案,但我仍然对细节有困难.其中一个答案描述了我的上述代码示例的行为在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中调用函数之前的参数评估顺序
对于下面的代码,我预计输出为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) 我获得了前后增量的基础,但是在实际发生在后期增量上时却难以下定决心。
例如,在以下帖子增量代码中:
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何时确切添加?
谢谢
是(++i)++未定义的行为?在检索增量对象以进行后缀增量操作后,是否可能发生前缀增量的副作用?这对我来说似乎很奇怪.
我的直觉是,这在C++ 03中是未定义的,在C++ 11中定义良好.我对吗?
c++ undefined-behavior sequence-points language-lawyer c++11
我有一个人声称这条线不在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].
他是对的吗?
我在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)
为什么这两种语言的输出不同?语言对于前后增量运算符的处理方式有何不同?
#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
这是否由于未定义的行为而发生,因为我将相同的变量与其递减的值进行比较?
任何人都可以解释我的输出.
#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
后缀增量具有更高的优先级,因此第二个索引的值应该增加.为什么第一个索引的值会增加?
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.