我在gcc上运行我的C代码来理解前/后增量运算符.然而,我看到的结果并不是我所期望的.就像第6行一样,因为我是5,它应该是
8 7 6 5 5
Run Code Online (Sandbox Code Playgroud)
但它是 8 7 6 5 8
然后显示最后一行14 14 14 14.有人可以解释一下这种行为.我曾预料到
14 14 13 12
这个编译器是否依赖?是否序列点上的printf函数的beahviour未定义?
#include <stdio.h>
int main()
{
i = 5;
printf("%d %d %d %d %d \n", i, i++, i++, i++, i);
printf("%d \n", ++i);
printf("%d \n", ++i);
printf("%d \n", ++i);
printf("%d %d %d %d \n", i, ++i, ++i, ++i);
}
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
int main()
{
int i=0;
while(i++,i<=8);
printf("%d\n",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么i在每个测试用例中比较后完成增量?
在执行下面的代码后发生了什么?
int x = 10;
x += x--;
Run Code Online (Sandbox Code Playgroud)
我期待结果19(将x添加到x然后将x减1)但结果为20.它如何在窗帘后面工作?谢谢你的回答.
先生,请你告诉我为什么" C "中的以下条件是false?
main()
{
int i=1;
if(i<=i++)
printf("false");
else
printf("true");
}
Run Code Online (Sandbox Code Playgroud) 与此问题相关的C代码:
#include <stdio.h>
int main(int argc, char **argv)
{
int k = 0;
double b = k++ + ++k + k--;
printf("%d", k);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
存储的值b是未定义的,但是怎么样k?
我发现这个的地方:
http://www.sanfoundry.com/online-c-test-precedence-order-evaluation/ Question#10
- 编辑 -
到目前为止我发现:存储的值b没有在任何地方使用,所以如果存储的东西b是唯一的UB,这个程序将不依赖于UB.
但我也在C99 6.5.2中找到了这一部分:
"在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的评估来修改一次."
并列在J.2下.未定义的行为:
"行为未定义......'''应'或''不得''出现在约束之外的要求被违反"
但实际问题尚未得到解答.
- 编辑#2 -
并不是说我想写一个,而是根据标准的'严格符合程序':
"不得产生依赖于任何未指定,未定义或实现定义的行为的输出"
因此,原始示例是错误的,因为它确实依赖于未定义的行为,即使有人会替换该行,它也将是未定义的
double b = k++ + ++k + k--;
Run Code Online (Sandbox Code Playgroud)
与线
k++ + ++k + k--;
Run Code Online (Sandbox Code Playgroud)
所以现在我正在寻找关于什么问题的更好的介绍.
今天我重新审视了Pre Increment和Post Increment.
我知道的基本定义.
预增量 - 增加值并返回值.
后递增 - 递增值并在递增之前返回值.
但是做一些他们的组合我很难过.
使用基本的C程序,这是我测试的.
最初i = 0.
第一次测试
printf("%d %d",++i,++i);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
2 2
Run Code Online (Sandbox Code Playgroud)
我期望:
1 2
Run Code Online (Sandbox Code Playgroud)
第二次测试
printf("%d %d",i++,i++);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
1 0
Run Code Online (Sandbox Code Playgroud)
我期望:
0 1
Run Code Online (Sandbox Code Playgroud)
第三次测试
printf("%d %d",i++,++i);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
1 2
Run Code Online (Sandbox Code Playgroud)
我期望:
0 2
Run Code Online (Sandbox Code Playgroud)
第四次测试
printf("%d %d",++i,i++);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
2 0
Run Code Online (Sandbox Code Playgroud)
我期望:
1 1
Run Code Online (Sandbox Code Playgroud)
我认为评估可能来自右侧或左侧.在Post增量的情况下,如果是Pre Increment,则可能是左边的.也许Pre Increment的优先级高于Post增量.一些与结果相匹配的想法,但在一次测试中做出的假设并不能解释其他输出.
在C++中,如果我从一个字符串中读取一个整数,那么我是否使用u或d作为转换说明符并不重要,因为它们都接受负整数.
#include <cstdio>
using namespace std;
int main() {
int u, d;
sscanf("-2", "%u", &u);
sscanf("-2", "%d", &d);
puts(u == d ? "u == d" : "u != d");
printf("u: %u %d\n", u, u);
printf("d: %u %d\n", d, d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我挖得更深,发现是否有任何区别.我找到
int u, d;
sscanf("-2", "%u", &u);
sscanf("-2", "%d", &d);
Run Code Online (Sandbox Code Playgroud)
相当于
int u, d;
u = strtoul("-2", NULL, 10);
d = strtol("-2", NULL, 10);
Run Code Online (Sandbox Code Playgroud)
是否有任何差异之间的所有u和d使用解析这些转换说明,即传递给格式时scanf …
我有一些代码用线增加一个计数器.
++ count;
Run Code Online (Sandbox Code Playgroud)
有时我有一个if条件,这意味着我应该将计数增加2.
count += 2;
Run Code Online (Sandbox Code Playgroud)
"双增量"是否以同样的方式工作?
++ ++ count;
Run Code Online (Sandbox Code Playgroud)
知道C和C++编译器是否以相同的方式解释这将是有帮助的.
我有这个功能,它自己添加一个数字.
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
#define ADD(x) (x)+(x)
int main()
{
int x = 2;
int y = ADD(++x);
cout << y << endl;
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,它返回8但我期待6.
我认为x = 3并且它正在向ADD函数发送3,但它似乎没有.有人可以向我解释一下吗?
int a = 3;
cout << ++a << a++ << ++a << a++ << endl;
Run Code Online (Sandbox Code Playgroud)
codeblocks :: mingw上这段代码的答案是7573.我到现在所知道的是,后增量是正确的,但前增量有一些不同的逻辑.对于所有预增量,最后一个增量的最后一个值将是相同的.任何人都可以用++ a告诉我实际发生了什么.
还有一件事需要从右到左解决.谢谢你的回答.