什么是"序列点"?
未定义的行为和序列点之间的关系是什么?
我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?
如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
#include <stdio.h>
volatile int i;
int main()
{
int c;
for (i = 0; i < 3; i++)
{
c = i &&& i;
printf("%d\n", c);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面编译的程序的输出gcc是
0
1
1
Run Code Online (Sandbox Code Playgroud)
使用-Wall或-Waddress选项,gcc发出警告:
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
Run Code Online (Sandbox Code Playgroud)
如何c在上述计划中进行评估?
可能重复:
请帮我理解C中的错误a +++++ b
在今天的讨论中,出现了前/后增量的主题.
我们尝试了几种添加和增量组合:
c = a+++b //works
c = a++ + ++b //works
c = a+++ ++b //works
c = a+++++b // doesn't work, compiler error "error: invalid lvalue in increment
Run Code Online (Sandbox Code Playgroud)
区别在哪里?这个额外的空格究竟为解析器添加了什么,以便程序编译?
int main ()
{
int a = 5,b = 2;
printf("%d",a+++++b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码提供以下错误:
错误:需要左值作为递增操作数
但是,如果我把整个空间a++ +和++b,然后正常工作.
int main ()
{
int a = 5,b = 2;
printf("%d",a++ + ++b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第一个例子中的错误是什么意思?
以下代码让我感到困惑
int a=2,b=5,c;
c=a+++b;
printf("%d,%d,%d",a,b,c);
Run Code Online (Sandbox Code Playgroud)
我预计输出为3,5,8,主要是因为a ++意味着2 + 1等于3,而3 + 5等于8,所以我预期3,5,8.事实证明结果是3,5,7.有人可以解释为什么会这样吗?
可能重复:
请帮我理解C中的错误a +++++ b
这是示例代码,为什么"a +++++ b"无法编译,但其他人可以?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int a = 0;
int b = 0;
int c = 0;
c = a+++b;
printf("a+++b is: %d\n", c);
c = a = b = 0;
c = a++ + ++b;
printf("a++ + ++b is: %d\n", c);
c = b = a = 0;
c = a+++ ++b;
printf("a+++ ++b is: %d\n", c);
c = b = a = 0;
c = a+++++b; …Run Code Online (Sandbox Code Playgroud) 如果C必须编译以下代码
int a = 5, b = 3, c = 7;
a = b---c;
Run Code Online (Sandbox Code Playgroud)
难道要分析它a = b-- - c,a = b - --c或者是不确定的行为?
我有以下代码:
public class Operators {
public static void main(String[] args) {
int i =+ 2;
System.out.println(i);
}
}
Run Code Online (Sandbox Code Playgroud)
执行后,我得到以下输出:2
那么=+运营商在这里做了什么呢?
编辑:
正如一些回答,这是分配+2到i,考虑下面的代码:
public class Operators {
public static void main(String[] args) {
int i =- -2;
System.out.println(i);
}
}
Run Code Online (Sandbox Code Playgroud)
所以在上面的例子中,输出应该是-2.但我得到了2
所以我想,它是-(-2),它给出了2.对吗?
如果我写一个像(在c中)的代码
x=1;
z=2;
y=x---z;
Run Code Online (Sandbox Code Playgroud)
将前两个 - 作为后减量处理,后来作为减法处理
或者第一个 - 将被视为减法,其他两个将被视为预先减少
如果我放一个空格使其成为另一个(因为在c程序中不会被空格改变)该怎么办?
c ×6
c++ ×4
operators ×4
c++-faq ×1
decrement ×1
gcc ×1
gcc-warning ×1
java ×1
lvalue ×1
parsing ×1
subtraction ×1
syntax ×1
token ×1
visual-c++ ×1