相关疑难解决方法(0)

什么是不确定的价值?

我在c99标准中找到了这个

3.17.2
1 indeterminate value
either an unspecified value or a trap representation
Run Code Online (Sandbox Code Playgroud)

以上陈述对我来说并不清楚.任何人都可以解释这是什么,它的优点和缺点是什么?

一些例子将受到高度赞赏.

c

13
推荐指数
2
解决办法
2425
查看次数

数组订阅是否算作获取对象的地址?

这个问题的灵感来自这个问题答案.

以下代码可能存在未定义的行为:

uint64_t arr[1]; // Uninitialized
if(arr[0] == 0) {
Run Code Online (Sandbox Code Playgroud)

C标准指定具有自动存储持续时间的未初始化变量具有不确定的值,该值是未指定的陷阱表示.它还指定uintN_t类型没有填充位,并且定义了值的大小和范围; 所以陷阱表示uint64_t是不可能的.

所以我得出结论,未初始化的值本身并不是未定义的行为.读它怎么样?

6.3.2.1左值,数组和函数指示符

  1. ...
  2. 除非它是运算sizeof符的操作数,_Alignof运算符,一元&运算符,++运算符,--运算符或者左运算符.运算符或赋值运算符,没有数组类型的左值被转换为存储在指定对象中的值(并且不再是左值); 这称为左值转换....

    ... 如果左值指定了一个自动存储持续时间的对象,该对象可以使用寄存器存储类声明(从未使用过其地址),并且该对象未初始化(未使用初始化程序声明并且未对其进行任何赋值)在使用之前),行为是未定义的.

  3. 除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将具有类型''数组类型''的表达式转换为表达式输入''指向类型'的指针,指向数组对象的初始元素,而不是左值.如果数组对象具有寄存器存储类,则行为未定义.

问题:下标数组是否计为获取对象的地址?

下面的文字似乎暗示下标数组需要转换为指针,如果没有获取地址似乎无法做到:

6.5.2.1数组下标

约束

  1. 其中一个表达式应具有类型''指向完整对象类型'的指针,另一个表达式应具有整数类型,结果具有类型''type''.

语义

  1. 后缀表达式后跟方括号[]中的表达式是数组对象元素的下标名称.下标运算符[]的定义是E1 [E2]与(*((E1)+(E2)))相同.由于适用于binary +运算符的转换规则,如果E1是数组对象(等效地,指向数组对象的初始元素的指针)并且E2是整数,则E1 [E2]指定E2-元素E1(从零开始计数).

这使§6.3.2.1第3段看起来很奇怪.如果订阅需要转换为指针,那么数组怎么可以注册存储类呢?

c arrays language-lawyer

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

POSIX在stdint.h中的"二进制补码表示"是什么意思?

众所周知,有符号整数溢出会调用未定义的行为,并且对有符号整数的按位操作最多也是不可靠的.因此,我发现POSIX标准这一行很奇怪:

type_f name int N _t指定一个有符号整数类型,其宽度为N,没有填充位和二进制补码表示.因此,int8_t表示具有正好8位宽度的有符号整数类型.

这是一个相当模糊的陈述,可能意味着这些事情的任何组合:

  1. 范围intN_t是从.INTN_MININTN_MAX.
  2. sizeof(intN_t) == N/8
  3. 按位运算的intN_t行为与二进制补码表示的预期相同. -1 ^ x == ~x在每个地方x插入intN_t演员之后.
  4. intN_t 不能有陷阱表示(并且优化编译器不得利用可能的陷阱).
  5. intN_t变量的溢出是定义的行为(并且从中换INTN_MAXINTN_MIN).

根据文件的其余部分,(1)和(2)对我来说似乎都很明显.(1)由INTN_MIN/ 的定义明确指定MAX.(2)暗示为"无填充位".

如果有的话,POSIX需要(3),(4)和(5)中的哪一个?

c posix language-lawyer

4
推荐指数
1
解决办法
240
查看次数

int []中的未赋值

想知道在C++中int[]通常是什么值的未分配整数.

int arr[5];
arr[1]=2;
arr[3]=4;
for(int i=0;i<5;i++)
{
  cout <<arr[i] <<endl;
}
Run Code Online (Sandbox Code Playgroud)

它打印

-858993460
2
-858993460
4
-858993460
Run Code Online (Sandbox Code Playgroud)

我们知道阵列会在{?,2,?,4,?}哪里?不明.

什么会"?" 通常?

当我测试时,我总是得到负值.我可以假设在C++中,整数数组中的未分配元素总是小于或等于零吗?

如我错了请纠正我.当我在Java中学习时,未分配的数组元素将产生null.

c++ visual-c++

3
推荐指数
1
解决办法
3012
查看次数

标签 统计

c ×3

language-lawyer ×2

arrays ×1

c++ ×1

posix ×1

visual-c++ ×1