小编op *_* ol的帖子

“强制转换指定转换”是什么意思?

在 C 1999 注释 86 中,对 6.5.4 5(我的粗体)说话

如果表达式的值表示的精度或范围比强制转换命名的类型(6.3.1.8)所要求的精度或范围大,则即使表达式的类型与命名类型相同,该强制转换也会指定转换

signed char a = -2;
unsigned char b = 1;
b = (short)a + (short)b;
Run Code Online (Sandbox Code Playgroud)

b = (short)a + (short)b;. 这是一个例子

如果表达式的值表示的精度或范围比由强制转换 (6.3.1.8) 命名的类型所需的精度或范围更大,

因为如果没有强制转换,a并且b两者都被提升为int,这比short强制转换命名的类型(假设short是 16 位和int32 位)具有更高的精度或范围。

那么,在这种情况下,后一句

然后即使表达式的类型与命名类型相同,转换也会指定转换。

我想知道这会如何影响b = (short)a + (short)b;

我的想法很简单。因为(cast)具有比加法更高的优先级+,首先ab被强制转换(short),然后两个操作数+被转换为通常的算术转换。但是这句话“即使表达式的类型与命名类型相同,转换也指定了转换”让我感到困惑。

c c99 language-lawyer typecasting-operator

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

C 中数组括号内的赋值表达式是什么?

在 C89 中 A.1.2.2 声明

直接声明符 [ 常量表达式 ]

在 C99 A.2.2 声明中

直接声明符 [ 类型限定符列表_opt 赋值表达式_opt ]

我理解assignment-expression_optvar = 1;。但数组的声明方式并不像int arr[i = 0];. 为什么 C99 使用术语“赋值表达式”而不是“常量表达式”?它是什么意思?

c language-lawyer

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

什么是 C 中的更新流?

在 n1256 7.19.5.2 第 2 段(我的粗体):

如果 stream 指向一个输出流或一个更新流,其中最近的操作没有输入,则 fflush 函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为未定义。

如果没有“更新流”这个词,整个段落就有意义了。但我不知道它是什么。标准本身没有介绍它。谷歌搜索似乎不起作用。它的意义是什么?

c stream language-lawyer

3
推荐指数
2
解决办法
66
查看次数

C中的副作用是什么?

在 C99 第 5.1.2.3 条第 2 段中,

访问易失性对象、修改对象、修改文件或调用执行任何这些操作的函数都是副作用,即执行环境状态的变化。

C 标准定义了如上所述的副作用。但是C99似乎没有解释到底什么是访问易失性对象,修改对象,修改文件(它在第3条中定义了访问,修改,对象的定义是什么。但是如何访问易失性?修改什么对象?并修改文件的内容?)。当我使用“副作用”
一词进行搜索时,C99 中有一些示例。但我无法确定每个示例是否都属于访问易失性对象、修改对象和修改文件。 我读过什么是c中的副作用?副作用是好事吗?但仍然很困惑。我的问题是 C 标准是否明确描述了副作用的含义?他们的意思是什么?

c side-effects

2
推荐指数
1
解决办法
1084
查看次数

C++ 包括 C99 还是 C89?

我即将学习C++。
C语言的语法有两种。指针和数组。
它们是在 C 标准中定义的,有很多子条款。我知道 C++ 是 C 的超集(它可能是一种概括)。那么这些特性和C++一样吗?如果是这样,什么版本的 C++ 有什么版本的 C?

c c++

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