Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何';答案是36?_C - Fatal编程技术网

C 如何';答案是36?

C 如何';答案是36?,c,C,可能重复: 这是没有定义的 您可以找到2005年5月6日的C标准委员会草案(pdf) 请参见第6.5节表达式: 2在上一个序列点和下一个序列点之间,对象的存储值最多应通过表达式的计算修改一次。此外,之前的值应为只读,以确定要存储的值 举个例子: 71)本段呈现未定义的语句表达式,如 i=++i+1 a[i++]=i 答案实际上是未定义的。在未定义的情况下回答,因为在某些情况下,解析器不知道如何解析代码 是a+++b:a+++b还是a+++b 想想这样一个事实:在分析源代码时,通常忽略空白。这可

可能重复:

这是没有定义的

您可以找到2005年5月6日的C标准委员会草案(pdf)

请参见第6.5节表达式:

2在上一个序列点和下一个序列点之间,对象的存储值最多应通过表达式的计算修改一次。此外,之前的值应为只读,以确定要存储的值

举个例子:

71)本段呈现未定义的语句表达式,如

i=++i+1

a[i++]=i

答案实际上是未定义的。

在未定义的情况下回答,因为在某些情况下,解析器不知道如何解析代码

a+++b
a+++b
还是
a+++b

想想这样一个事实:在分析源代码时,通常忽略空白。这可能取决于编译器的实现(以及具有相同
++
运算符的某些其他语言可能会选择优先考虑其中一种而不是另一种),但通常这并不安全


例如,在Java中,您的代码行给出了37作为答案,因为它选择根据优先级以特定方式绑定
++
运算符,但这只是一种选择。

这显然是一个巨魔问题。这不是在过去48小时内出现的吗?@Johannes这是一个有效的问题。我用c#运行了这段代码(.net framework 4)答案是37:)Robert,我认为在这种情况下,由编译器决定哪个运算符优先(我想我读到了规范没有说明的地方)。谢谢,我删除了我的编辑,因为我想到了优先权…@Robert:因为C就是这样定义的(按照它的标准):多次修改同一事物的表达式的结果未定义。在实践中,任何实现都趋向于一致,但严格地说,你甚至不能依赖于它。Dev cpp和gcc都给出了相同的答案;printf(“\n%d”,a);将答案打印为33,a的值打印为10。a=10是合理的,那么答案是33呢!!不是真的。这些标记的起点和终点都有很好的定义。在
a+++b
中,这是
a+++b
(最大芒克原理)。哦,明白了,同一个变量给出的不确定性修改了多次。我认为我的观点也应该顺便考虑一下,因为这是真的:)是的,它在一个特定的实现中定义得很好,但它可能会改变,我们在另一个问题中讨论了它。。让我来查找它,而修改后的代码类似于:printf(“%d”,a+++++++a+++a+++a+++);printf(“\n%d”,a);将答案打印为33,a的值打印为10。a=10是合理的,那么答案是33呢!!因为您并没有指定要递增的变量,而只是打印出整个总和。
main()
{
   int a=5;
   a= a++ + ++a + ++a + a++ + a++;
   printf("%d",a);
}