Objective-C中是否已经定义了"复数"?

Ron*_*ald 10 objective-c real-datatype

对于以下代码,

- Objective-C如何知道在复数中添加"i"?当我在Complex.m文件中将"real"和"imaginary"定义为double值时,我认为Xcode只知道"real"和"imaginary"是double值.

- 如果我在main.m文件中的复数的末尾添加"i",例如,如果我转为"myComplex.imaginary = 7;" 进入"myComplex.imaginary = 7i;" 该行的输出变为0.00000i,如果我添加任何其他字母,程序将无法运行,为什么会这样?

基本上在我看来,Xcode已经知道"真实"和"想象"的含义,我所遵循的那本书没有具体说明,所以我有点困惑.

此外,我应该注意,我没有创建以下代码,因为我无法自己解决问题,此代码是从我的书籍论坛成员复制的.

//  Complex.h

#include <Foundation/Foundation.h>

@interface Complex : NSObject
@property double real, imaginary;
-(void) print;
-(Complex *) add: (Complex *) complexNum;
-(Complex *) subtract: (Complex *) complexNum;
-(Complex *) multiply: (Complex *) complexNum;
-(Complex *) divide: (Complex *) complexNum;
@end

//  Complex.m

#import "Complex.h"

@implementation Complex
@synthesize real, imaginary;

-(void) print
{
    NSLog(@"%f + %fi", real, imaginary);
}
-(Complex *) add: (Complex *) complexNum
{
    Complex *result = [[Complex alloc]init];
    result.real = real + complexNum.real;
    result.imaginary = imaginary + complexNum.imaginary;
    return result;
}
-(Complex *) subtract: (Complex *) complexNum
{
    Complex *result = [[Complex alloc]init];
    result.real = real - complexNum.real;
    result.imaginary = imaginary - complexNum.imaginary;
    return result;
}
-(Complex *) multiply: (Complex *) complexNum
{
    Complex *result = [[Complex alloc]init];
    result.real = real * complexNum.real;
    result.imaginary = imaginary * complexNum.imaginary;
    return result;
}
-(Complex *) divide: (Complex *) complexNum
{
    Complex *result = [[Complex alloc]init];
    result.real = real / complexNum.real;
    result.imaginary = imaginary / complexNum.imaginary;
    return result;
}
@end

//
//  main.m
//  Complex

#include <Foundation/Foundation.h>
#import "Complex.h"

int main(int argc, const char *argv[]) {

    @autoreleasepool {
        Complex *myComplex = [[Complex alloc]init];
        Complex *totalComplex = [[Complex alloc]init];
        Complex *yourComplex = [[Complex alloc]init];

        myComplex.real = 5.3;
        myComplex.imaginary = 7;
        [myComplex print];
        NSLog(@"+");

        yourComplex.real = 2.7;
        yourComplex.imaginary = 4;
        [yourComplex print];
        NSLog(@"=");

        totalComplex = [myComplex add: yourComplex];
        [totalComplex print];
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 12

复数类型在C99中定义,Objective-C的现代版本是它的超集.实际语法如下:

#include <complex.h>

...

complex double z = 2.7 + 3.4*I;
complex double w = 4.5 - 1.7*I;
complex double t = z*w;
printf("%g + %gi", creal(t), cimag(t));
Run Code Online (Sandbox Code Playgroud)

i后缀是来自GCC扩展.Xcode使用的编译器(clang)具有与GCC兼容的大多数功能,因此您可以编写3.4i并且没有错误.


对于你的问题,

  • Objective-C如何知道在复数中添加"i"?

如果你的意思是输出,没有Objective-C不知道添加"i".它打印"i"只是因为你告诉它

-(void) print
{
    NSLog(@"%f + %fi", real, imaginary);
//                 ^
}
Run Code Online (Sandbox Code Playgroud)
  • 如果我转"myComplex.imaginary = 7;" 进入"myComplex.imaginary = 7i;" 该行的输出变为0.00000i

因为7i是一个虚数,并且myComplex.imaginary是一个"双",因此是一个数.C标准建议,当在实数和虚数之间进行转换时,您将得到零(C99§G.4.2/ 1).因此,你写的有效myComplex.imaginary = 0.0;.

  • 如果我添加任何其他字母,程序将无法运行,为什么会这样?

其实你可以写点东西7.0if.同样,这是一个C-thing,Objective-C已经适应了.您可以添加一个f将十进制数字从默认类型"double"变为"float",并且GCC添加了一个额外的功能,您可以添加一个i将实数转换为虚数.其他类似的东西7.0x会导致编译器停止,因为它不知道是什么x意思.


小智 7

C99添加了对复数的本机支持,因此现在它们像普通的浮点数或整数一样容易处理.没有更丑陋的结构!假设通过使用数字的浮点表示来做技巧,_Complex_I等效I宏具有一个值,当乘以实数时,会产生多个类型double complexfloat complex(complex是一个新类型修饰符关键字,也在C99中引入) .因此,使用这种新的便利功能,您可以轻松地在C中执行复数计算

#include <complex.h>

double complex z1 = 2.0 + 3.0 * I;
double complex z2 = 1.5 - 2.0 * I;
double complex prod = z1 * z2;

printf("Product = %f + %f\n", creal(prod), cimag(prod));
Run Code Online (Sandbox Code Playgroud)

请检查GNU对此的解释.

i后缀是GNU扩展到C99语言,因此它是非标准.然而,Xcode(GCC和Clang)使用的两个编译器都实现了这种扩展.

(旁注:Xcode 对此一无所知.请不要将IDE与编译器混淆.Xcode本身不会执行编译 - 它背后的编译器会这样做.)