我认为三元运算符会根据条件返回:
左侧或右侧的值。为什么这段代码打印1?
#include <stdio.h>
int main(int argc, char const *argv[]) {
int c = 0;
(c?c:0)++;
printf("%i", c);
return 0;
}
答案 0 :(得分:13)
您似乎有编译器错误,或者可能是语言扩展,因为这不是有效的C.您需要左值才能应用++
运算符,而(c?c:0)
不是左值。
答案 1 :(得分:0)
我也遇到了一些与此相关的奇怪现象。似乎三元条件的结果可以被视为gcc 3.3.2中的左值,但不是gcc 4.6(我没有更多的版本准备好进一步缩小它)。事实上,使用gcc 4.6编译gcc 3.3.2是不可能的,因为gcc 4.6对构成左值的内容更加挑剔。
另一个不使用gcc 4.6编译的gcc 3.3.2源代码示例:
char *x = ...;
*((void**)x)++ = ...;
gcc 4.6可以将强制转换的结果视为左值并增加它,但gcc 4.6不会。
我也没有相关标准可以发现这是官方标准中发生变化的事情,或者只是gcc在某个阶段允许的事情。
另请注意,C ++允许三元运算符返回左值,但仍然不能递增0.所以这是有效的C ++但不是有效的C:
int c = 0, d = 0;
(c?c:d)++;
答案 2 :(得分:-2)
仅仅因为你在做
(c?c:0)++;
如果你不让“++”发生,你就会得到你想要的东西。
#include <stdio.h>
int main(int argc, char const *argv[]) {
int c = 0;
/* (c?c:0)++; */
printf("%i \n", (c?c:0)++ );
return 0;
}
输出是:
$ gcc -o ternary ternary.c
$ ./ternary
0
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)