相关疑难解决方法(0)

如果a未初始化,是^ a还是aa未定义的行为?

考虑这个程序:

#include <stdio.h>

int main(void)
{
    unsigned int a;
    printf("%u %u\n", a^a, a-a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是不确定的行为?

从表面上看,它a是一个未初始化的变量.所以这指向未定义的行为.但是a^a并且a-a等于0所有的价值a,至少我认为是这样的.有可能有某种方式来证明行为是明确定义的吗?

c undefined-behavior

74
推荐指数
2
解决办法
3332
查看次数

在C++ 14中,C++标准是否在使用不确定值和未定义行为方面发生了变化?

正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:

int x = 12;
{ int x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]

Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.

在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:

unsigned char x = 12;
{ unsigned char x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]

C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?

c++ undefined-behavior language-lawyer c++11 c++14

62
推荐指数
1
解决办法
3991
查看次数

初始化是否需要左值到右值的转换?是`int x = x;`UB?

C++标准包含一个半着名的例子,在3.3.2中的"令人惊讶的"名称查找,"声明点":

int x = x;
Run Code Online (Sandbox Code Playgroud)

这初始化x自身,(原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量).

这实际上是未定义的行为吗?

根据4.1"左值到右值转换",对未初始化的值执行左值到右值的转换是未定义的行为.右手是否x接受这种转换?如果是这样,示例实际上会有未定义的行为吗?

c++ initialization undefined-behavior language-lawyer

55
推荐指数
2
解决办法
2411
查看次数

a&b的结果是什么?

这很尴尬,但按位AND运算符在C++标准中定义如下(强调我的).

执行通常的算术转换; 结果是其操作数的按位AND功能.运算符仅适用于整数或无范围的枚举操作数.

这看起来对我来说毫无意义.据我所知,"按位AND函数"在标准中的任何地方都没有定义.

我知道AND功能已被充分理解,因此可能不需要解释."按位"一词的含义也应该相当清楚:该函数应用于其操作数的相应位.但是,操作数的位构成不清楚.

是什么赋予了?

c++ bitwise-operators language-lawyer

39
推荐指数
3
解决办法
6618
查看次数