大佬们,这行代码算不算未定义行为
c语言吧
全部回复
仅看楼主
level 5
怒人水瓶
楼主
今天写出来这种代码,把它简化成了这个demo(这个样例逻辑有点蠢,但不是关键),犹豫要不要把这行代码分成三个语句,因为func的运行会对z造成影响,写成一句可能会混乱,但实际运行成功了,且是
正确的
,这是为什么呢?一行代码就是从左往右依次运行的吗?
2022年09月06日 13点09分
1
level 6
真º路人
不一定,不同编译器的求值顺序可能会不一样,可能从左往右也可能从右往左,这是未定义行为
2022年09月06日 13点09分
2
怒人水瓶
好
2022年09月06日 14点09分
level 8
gemini_ae
不算吧,c对运算符结合顺序是有规定的,不过还是不建议这么写。
2022年09月06日 14点09分
3
蝕戀
operator 不等於 operand
2022年09月06日 15点09分
吧务
level 14
GTA小鸡
这个表达式在所有序列点之间都只有一次副作用,所以行为良好定义,不是未定义行为,而是未指定行为(unspecified behavior)。因为标准没有指定+号两边哪个表达式先求值,所以编译器有且仅有几种可能的选择,z有且仅有四种可能的值,但具体是哪种不能确定。
2022年09月06日 15点09分
4
吧务
level 14
GTA小鸡
https://en.wikipedia.org/wiki/Unspecified_behavior#Order_of_evaluation_of_subexpressions
这一段例子完美解答了你的疑问
2022年09月06日 15点09分
5
怒人水瓶
谢谢大佬,看了你上面的讲解,去百度了序列点的相关内容,又学到新知识了
2022年09月06日 15点09分
level 5
怒人水瓶
楼主
未定义行为 - 程序的该行为没有限制。未定义行为的例子是越过数组边界的访问、有符号整数溢出、空指针解引用、在表达式中超过一次修改标量而其中无顺序点、通过不同类型的指针访问对象,等等。编译器不要求诊断未定义行为(尽管多数简单情形是得到诊断的),且编译后的程序不要求做任何有意义的事。
未指定行为 - 容许二种或多种行为,且不要求实现规范每种行为。例如,求值顺序、同样的字符串字面量是否有别,等。每个未指定行为导致一组合法结果之一,并且可以在同一程序中重复时产生不同结果。
实现定义行为 - 在未指定行为之上,实现规范了如何选择。例如,字节中的位数,或有符号整数右移是算术还是逻辑。
2022年09月06日 15点09分
6
怒人水瓶
不要瞎搞,多写两行代码更安全
2022年09月06日 15点09分
level 7
艾萨克雷诺
不建议吧,虽然一般没问题,但但凡有编译器不按从左向右+就出错了。复杂代码这样写也容易看漏,不好改然后变成屎山代码
2022年09月07日 07点09分
7
1