与 DelphiGuy 讨论,请标准党入请给个答案,有还是无,并给出标准依据一:C/C++ codeint main(){int i3int x
与 DelphiGuy 讨论,请标准党入
请给个答案,有还是无,并给出标准依据
一:
C/C++ codeint main(){ int i=3; int x=(++i*5)+(++i*7); printf("%d\n", x); return 0;}
针对如下顺序,C++标准有无规定(或建议)说不行?
++i
++i
a=i*5
b=i*7
x=a+b
二:
C/C++ codeint* func(int v){ static int k=0; k=v; return &k;}int main(){ int x=*func(7)-*func(9); printf("%d\n", x); return 0;}
针对如下顺序,C++标准有无规定(或建议)说不行?
a=func(7)
b=func(9)
x=*a
y=*b
x=a-b
[解决办法]从道理上来说,第一个和第二个实际类似的,但是第一个表达式里面划分不了顺序点,还没找出比较确切的依据。不过大部分C++编译器是不那样实现的,算是半个依据吧。
[解决办法][对于第一问]
C/C++标准对此没有明确定义,把自由度交给了编译器,因此这样的用法结果是不确定的。
在《C Prime Plus(第五版)中文版》第101页,可以找到以下依据:
另一个麻烦的可能来源是像这样的语句:
ans = num / 2 + 5 * (1 + num++);
问题依然是编译器可能不以您想象的顺序来操作。您可能认为编译器应该先找到num / 2,然后继续进行;但是它可能先做最后的项目,即先增加num的值,然后在num / 2中使用新值。这些都是没有保证的。
[解决办法]偶不认同标准党这种称呼,但偶对这个问题的讨论感兴趣。
标准规定,子表达式的计算顺序是非指定的,对于副作用的发生时间,仅规定在上一个序列点之后,下一个序列点之前,但这两个序列点之间啥时候发生无规定,标准同时也规定,在两个序列点之间相同的副作用发生多于一次以上属于未定义行为。
因此,对于楼主的两个问题,理论上任何顺序都是可能的,但是,编译器的设计者仅会作出他认为合理的方案。这属于合理性问题,而非唯一性问题。
[解决办法]虽然编写程序的时候会尽量去避免这样的情况,但是这样的讨论还是很有意义的,而且“标准党”也远比“共产党”来得亲切!
[解决办法]相比顺序点, C++11 的 顺序关联 对求值顺序描述得好得多.
你给的顺序是符合标准的,只是行为未定义.
[解决办法]不懂什么是标准 标准只是个相对的概念 我进来时候想标准的 结果后来凌乱了
[解决办法]c/c++标准应该加一条: 未定义行为编译时提示警告
[解决办法]楼主的问题很有技巧性啊~~
标准的确没说这样"不行".它只是说你们自己随便.
[解决办法]对于主楼的两个问题,标准没规定主楼的顺序不行,不过标准也不保证肯定就是主楼的顺序。标准说的是,这种程序的行为是未定义的。
[解决办法]无聊的帖子。
显然都是没看过exceptional c++ / more excecptional c++的。
[解决办法]两个题目都是一样的
标准没说NO
即不会出现ERROR
但是 不同编译器可以有不同结果
华丽丽的UB了
然后 LZ给出的是一种可能的实现
仅此而已
[解决办法]蛋疼,话说真的每隔一段时间就能看见这样的帖子。
不是说顺序交给编译器去选择么?
不要说讨论这些很意义,真的有很有意义?
谁的代码里面会(敢)这样写?公司你家开的?
既然谁都会避免这样写代码,那这样的代码存在的意义何在?
写好的代码不是写的很复杂只有自己懂,而是能够让别人也能轻易读懂!
有时间浪费在讨论这么扯淡的问题,除非你是准备面试了,否则还是赶紧将时间用在正确的方向上吧!
记住,选择比努力更重要!
[解决办法]编译器我就不说了。
建义你看看表达式的副作用、顺序点相关内容。每个编译器在这方面实现的是有差异的。
[解决办法]