C:未定义的行为事实

标签 c type-conversion

1) 我已经读过很多次关于 C 中未定义行为的内容。也就是说:C 在其定义中没有提及的一些行为,因此每个编译器都会有其实现,但不会违反 C 标准。示例为:x=++y*4+++y*3

但是,这里有人可以给我两个给出不同结果的编译器吗?我有兴趣用它进行测试。 (在我的机器上,我只有 mingw)

2) 并且,C 没有说明 + - */ 操作的顺序。例如:1*2 + 3 + 4*5*/ 将首先计算,但我们不知道它的另一个。

根据下面的例子:如果我们有:

int a, b, c; 
// assign value for a,b,c
float result = a*b/c; // wrong
float result = (float)a*b/c; // seem true

但是,b/c仍然可以先计算,所以答案会是错误的。所以,真正的类型转换应该是:

浮点结果 = a*b/(float)c

但是,几乎所有关于 C 语言的书籍,所有编写 C 语言的人,都总是使用: (float)a*b/c 。这是否总是正确的,或者他们相信“普通编译器”会像我们通常认为的那样从左到右解决?

请让我更清楚地了解这一点。

谢谢:)

最佳答案

对于1)你混淆了未定义的行为和未指定的行为,它们是不一样的。 你给出的这个丑陋的表达有未定义的行为;您认为未定义行为的后果只是非特定行为,即编译器选择了不同的可能性之一,这通常是您可以忍受的。

未定义的行为可能会更糟糕。如果行为未定义,编译器通常可以选择任何它喜欢的东西,吃你的午餐,清空你的银行帐户,让你的计算机崩溃。不幸的是,在某些情况下,编译器会做出你意想不到的坏事。所以一开始就不要激怒UB。

关于C:未定义的行为事实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401627/

相关文章:

c# - 无法在方法调用中将字典转换为 IDictionary

c - 如何调用另一个程序并通过 $ 获取返回值?

c - LibCurl C Http 发布/获取

c - 将错误的 C 原型(prototype)显示为构建警告

c - 为什么 if(1/10) 和 if(0.1) 有不同的值?

C 浮点文字 - 在 EBNF 中定义

python - 将 Pandas 数据框列转换为数字的更好方法

java - 将 long 编码为 int,反之亦然

c++ - 为什么这个涉及重载运算符和隐式转换的 C++ 表达式不明确?

c# - 在 C# 中使用 Xml 序列化从一个类转换为另一个类