当我在三元运算符中使用指针时,如果条件为真,它将执行exp3
#include <stdio.h>
int main(){
int a,b;
printf("Enter first number:");
scanf("%d",&a);
printf("Enter second number:");
scanf("%d",&b);
printf("Address of a:%u \n",&a);
printf("Address of b:%u \n",&b);
int *ptr=&b;
// when i use pointer in ternary operator if condition is true it execute exp3
// problem in this line
(*ptr++) > (*ptr) ? printf("\n %d is the maximum number",b):printf("\n %d is the maximum number",a);
(a>b) ? printf("\n %d",a) : printf("\n %d",b);
return 0;
}
1条答案
按热度按时间eqoofvh91#
您的代码中有几个问题会导致undefined behaviour第一个问题是你不恰当地使用了指针算法。像递增、递减和比较这样的操作只有在指向数组元素的指针上才真正有用。在你的例子中,
a
和b
都不是数组(尽管从编译器的Angular 来看,它们可以被视为单元素数组),因此编译器没有义务为这些变量遵循任何特定的 * 相对 * 内存安排:它们 * 可以 * 在存储器中相邻,或者被任意数目的字节分隔;并且即使它们 * 是 * 相邻的,它们也可以是“任意一种”(即,a
或b
可以在较低地址中)。我们可以在代码中创建一个“快速解决方案”,方法是声明一个 * 实际数组 *,然后为该数组的元素创建
a
和b
标记别名:UB的另一个原因是在显示指针时使用了错误的
printf
说明符;指针应该使用%p
说明符打印,即使这样,当作为参数传递给printf
时,指针也应该转换为void*
:但是UB的第三个--也许是最重要的--来源出现在条件('三元')运算符的“条件”表达式中:
(*ptr++) > (*ptr)
比较。对于这个表达式,C标准没有指定
>
的哪个操作数先被求值(即>
操作符是 not a sequence point),因此,使用中间变量扩展编译器可能解释它的方式,我们可以得到:或者,编译器同样有权这样做:
我们可以通过显式地使用如上所述的中间变量来解决这个UB问题:
但是请注意,即使这样,代码也会显示错误的答案,这是由于应用后增量的方式(即,在
*ptr
的值被赋给T1
之后**)。如果你必须在代码中使用指针,那么就避免后增量,只需要简单的加法就可以得到
b
(或者第二个元素)的地址,这样当ptr
引用a
(第一个元素)时,ptr
就保持不变: