我以为我理解了C++中的序列点是如何工作的,但是让我感到困惑:
int f(int &x, int c) {
c = c - 1;
if (c == 0) return 1;
x = x + 1;
return f(x, c) * x;
}
int main() {
int p = 5;
cout << f(p, p) << endl;
return 0;
}
这个问题的“正确”答案是打印6561。事实上,在VS2013中是这样的。但是,它不是UB吗?因为没有任何保证将首先评估:f(x, c)或x。如果首
我仍然无法清楚地理解x ^= y ^= x ^= y;表达式在C++11中是否有效(就像他们在中所说的那样)还是导致了未定义的行为?
链接给出的理由似乎令人信服,但clang抛出了一个
警告:未排序的修改和对“x”-Wunsequenced的访问
此外,如果这两个版本:
x ^= y ^= x ^= y; // (1)
x = x ^ (y = y ^ (x = (x ^ y))); // (2)
被认为是等价的(在C++11中定义良好),为什么给出不同的结果(,)?
另外,应该注意的是,gcc只在第二个版本的代码上给出了一个关于序列点的。
我开始学习用c语言编程,我认为我已经对操作符的优先级很有信心了,直到我这样做了:
a > b ? c = a : (c = b);
当然,我第一次没有在最后一句中使用括号,但由于这最终导致了编译问题,我在这个论坛上搜索了如何解决这个问题,并且我读到添加括号可以完成这项工作。但是,我认为括号内的表达式在同一行写的任何其他表达式之前执行,这意味着首先执行c = b语句,然后执行三元操作符。为了更好地了解操作符优先级的情况,我做了一些类似但更容易理解的事情,并尝试执行这一行:
printf("Number is %d", i) + (i = 5);
我知道这个表达式返回一个值,
我有这个问题
SELECT bul.id
FROM bul
WHERE id IN (SELECT hotid AS parentid
FROM likehot
WHERE hotid IN (SELECT id
FROM bul
WHERE DATE >= '1315976410')
GROUP BY hotpid
ORDER BY COUNT( hotid ) DESC )
当我运行这个内部查询时
SELECT id
FROM bul
WHERE DATE >= '1315976410')
GROUP BY hot
为了了解++c/c++操作符是如何工作的,我试着运行以下C程序:
int c = 5;
c = c - c++;
printf("%d\n", c);
打印1,我猜逻辑是++是在使用它的代码行之后应用的,所以c变成了= c - c ( 0 ),在“下一行”上它增加了1。但对我来说似乎很奇怪,我想更详细地了解在运营商优先方面应该发生什么。
现在谈一谈:
int c = 5;
c = c - ++c;
printf("%d\n", c);
这张打印0,我真不明白为什么。如果从左到右解析了右手的值,我猜它会读取c ( 5 ),然后是++c (6),因为应该立即应用它。