相关疑难解决方法(0)

C和C++中+ =的结果是什么?

我有以下代码:

#include <stdio.h>
int main(int argc, char **argv) {
    int i = 0;
    (i+=10)+=10;
    printf("i = %d\n", i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用gcc将其编译为C源代码,则会出现错误:

error: lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用g ++将其编译为C++源代码,我将得到没有错误,当我运行可执行文件时:

i = 20
Run Code Online (Sandbox Code Playgroud)

为什么不同的行为?

c c++

92
推荐指数
2
解决办法
7192
查看次数

重新加载未定义的行为和序列点

将此主题视为以下主题的续篇:

上一部分
未定义的行为和序列点

让我们重新审视这个有趣复杂的表达(斜体短语取自上述主题*smile*):

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

我们说这会调用undefined-behavior.我假定说这个的时候,我们隐含假设i是内置的类型之一.

如果什么类型i是用户定义类型?比如它的类型是Index在本文后面定义的(见下文).它还会调用未定义的行为吗?

如果是,为什么?它不等同于写作i.operator+=(i.operator++());甚至语法上更简单 i.add(i.inc());吗?或者,他们是否也调用未定义的行为?

如果不是,为什么不呢?毕竟,对象在连续的序列点之间i被修改两次.请回想一下经验法则:表达式只能在连续的"序列点"之间修改一个对象的值.如果 i += ++i是表达式,那么它必须调用未定义的行为.如果是,那么它的等价物i.operator+=(i.operator++());i.add(i.inc());必须调用undefined-behavior似乎是不真实的!(据我所知)

或者,i += ++i不是一个开头的表达?如果是这样,那么它是什么以及表达式的定义是什么?

如果它是一个表达式,并在同一时间,其行为也是定义良好的,那么就意味着与表达相关序列点的数量在某种程度上取决于该类型的参与表达操作数.我是否正确(甚至部分)?


顺便问一下,这个表达怎么样?

//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the …
Run Code Online (Sandbox Code Playgroud)

c++ c++-faq undefined-behavior sequence-points

84
推荐指数
5
解决办法
1万
查看次数

单个语句中的多个复合赋值:是否为未定义行为?

我无法找到明确的答案:以下代码是否有未定义的行为?

int x = 2;
x+=x+=x+=2.5;
Run Code Online (Sandbox Code Playgroud)

c++ undefined-behavior c++11

11
推荐指数
1
解决办法
677
查看次数

序列点来自哪里?

我知道写点东西

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

不仅是不可读的,而且还违反了c/c ++序列点.

这些限制来自哪里?在将它们视为错误之前,如何才能看到这些"问题"?

c c++ sequence-points

9
推荐指数
3
解决办法
2337
查看次数

数组[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++中有效但在C中不有效?

测试.(C/CPP)

#include <stdio.h>

int main(int argc, char** argv)
{
  int a = 0, b = 0;
  printf("a = %d, b = %d\n", a, b);
  b = (++a)--;
  printf("a = %d, b = %d\n", a, b);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我将上面的内容保存为.cpp文件,它会在执行时编译并输出:

a = 0, b = 0
a = 0, b = 1
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其保存为.c文件,我会收到以下错误:

test.c:7:12: error: lvalue required as decrement operator.
Run Code Online (Sandbox Code Playgroud)

(++a)手术前不应该解决(newValue)--手术吗?有没有人对此有任何见解?

c c++ incompatibility lvalue language-lawyer

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