回答
由于ISO标准说你不能改变一个变量超过一次(或更改,并使用一个),中间没有序列点。
使用i
在a[i]
和i
在i++
的变化之间没有序列点。
的序列百分点C11列表(没有真正改变,自从C99多)附录C中描述:
- 功能标志的函数调用的评估和实际参数和实际通话之间。
- 以下运算符的第一和第二操作数的评价之间:逻辑AND & &;逻辑OR ||;逗号,。
- 在对条件?:运算符的第一个操作数和第二个和第三个操作数中的哪一个进行求值之间进行评估。
- 完整声明的结束:声明符;
- 完整表达式的评估与下一个要评估的完整表达式之间。以下是完整的表达式:初始化器;表达式中的表达式;选择语句的控制表达式(if或switch);一个while或do语句的控制表达式; for语句的每个表达式;在return语句中的表达式。
- 紧接库函数返回之前。
- 执行与每个格式化的输入/输出函数转换说明符相关的操作之后。
- 紧接在每次调用比较函数之前和紧接之后,以及任何对比较函数的调用和作为参数传递给该调用的对象的任何移动之间。
和5.1.2.3 Program execution
状态:当A为之前或B之后测序
评价A和B被不定测序,但它是未指定的哪个。
表达式A的评价与B之间的序列点的存在意味着,与A相关联的每一个值的计算和副作用与B相关联的每一个值的计算和副作用之前测序如果在任何排序中发生这样的未测序副作用
如果有一个表达式的子表达式的多个允许排序,其行为是未定义:
部分
6.5 Expressions
几乎涵盖您的具体情况。本段描述了未定义的语句表达式,如
i = ++i + 1;
和a[i++] = i;
,同时允许i = i + 1;
和a[i] = i;
。
它确实有效,但可能并不如预期。问题是如果不清楚i
是否在赋值之前递增,如果是,则a[i]
将引用数组中的下一项。
你的问题非常简洁,所以如果你想了解更多信息,你可以扩展它。但很难确切地说明语法分配给哪个元素a
。
不,它不起作用。它是*未定义的行为*。 – 2012-03-30 06:01:06
@亚当:只是因为它的行为不是由标准定义的,几乎意味着它不起作用。根据实施情况,它可能工作得很好。 (不要忽视*不起作用的事实*是一个可怕的解释,不应该被试图描述技术问题的开发人员使用。) – 2012-03-30 06:03:04
- 1. 为什么“for(; i <= 10; i ++)”工作,但“for(i = 0; i <= 10 ;;)”不?
- 2. i = i ++不增加i。为什么?
- 3. 在C编程语言中:A [i]和i [A]都指向数组A的第i个元素。为什么?
- 4. 为什么i = i + 1比i ++快?
- 5. 为什么-i ++和 - (i ++)不同?为什么结果如下?
- 6. 为什么人们使用i = i + 1而不是i ++?
- 7. 为什么我的javascript for循环不起作用? for(var i = 1; i <5; i ++;){document.write(“A statement has run”); }
- 8. 为什么'int i = i;'法律?
- 9. C中的“a +++ i”等于“(a ++)+ i”
- 10. 调试.Cells(i - 3,“A”)。Formula =“= Sheet2!A”&i&“”
- 11. 什么是返回void 0 === i &&(i = 3),0 ===我? (..A ..):(..B ..)呢?
- 12. 为什么“for(i = 100; i <= 0; --i)”永远循环?
- 13. s_i = s [i] - 'a'是什么意思?
- 14. 这句话做什么“while(a [i] - != 0)”?
- 15. ++ array [s.charAt(i) - 'A']究竟干什么?
- 16. 为什么位操作i&(-i)等于最右边的位?
- 17. 当i = 10时,为什么输出“未定义”(i = 0; i <10; i ++)?
- 18. 为什么Array(100).map((_,i)=> i + 1)不返回[1,2,...,100]?
- 19. var i = [0]在for循环中,然后增加i ++ - 为什么它工作?
- 20. 为什么在for循环中“++ i”和“i ++”有什么区别?
- 21. 为什么“for($ i = 1; $ i -le 1000000; $ i ++){}”的执行时间快于“for([int] $ i = 1; $ i -le 1000000; $ i ++){}”在PowerShell中
- 22. 为什么对于(int i = 0; i <10; ++ i)和for(int i = 0; i <10; i ++)返回相同?
- 23. 为什么不git rebase -i:/ ^主要工作?
- 24. 为什么须藤dpkg -i来filename.deb不工作
- 25. 为什么它使用sed -e工作,但不能与SED -i
- 26. INT I = 99但是工作INT I = 099不工作
- 27. 为什么scanf(“%i”,a)不像0b101那样采用二进制?
- 28. 以A,E,I,
- 29. 为什么RecyclerView.getChildAt(i)和Recycler.getLayoutManager()。getChildAt(i)返回不同的视图
- 30. C++ STL - 为什么要用(W <* I),而不是(W == * I)
你会得到什么错误? – Habib 2012-03-30 05:58:04
您声明了所有变量? – Ben 2012-03-30 05:59:14
你的意思是不工作?你得到的任何错误或你没有得到预期的结果?什么是什么? – Vijay 2012-03-30 05:59:39